The challenge
You are given an array of strings and your task is to remove all consecutive duplicate letters from each string in the array.
For example:
dup(["abracadabra","allottee","assessee"]) = ["abracadabra","alote","asese"]
.dup(["kelless","keenness"]) = ["keles","kenes"]
.
Strings will be lowercase only, no spaces. See test cases for more examples.
The solution in Java code
Option 1 (using StringBuilders
):
class Solution{
public static String[] dup(String[] arr){
String[] strings = new String[arr.length];
for (int h = 0; h < arr.length; h++) {
String str = arr[h];
StringBuilder sb = new StringBuilder();
char current = 0;
char last = 0;
for (int i = 0; i < str.length(); i++) {
current = str.charAt(i);
if (current!=last) sb.append(current);
last = current;
}
strings[h] = sb.toString();
}
return strings;
}
}
Option 2 (reusing the input array):
class Solution{
public static String[] dup(String[] arr){
for(int i = 0; i < arr.length; i++)
arr[i] = arr[i].replaceAll("(.)\\1+", "$1");
return arr;
}
}
Option 3 (using Stream.of
):
import static java.util.stream.Stream.of;
interface Solution {
static String[] dup(String[] arr) {
return of(arr).map(s -> s.replaceAll("(\\w)\\1+", "$1")).toArray(String[]::new);
}
}
Test cases to validate our solution
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
import org.junit.runners.JUnit4;
import java.util.*;
public class SolutionTest{
private static Random random = new Random();
private static String unDup1(String s){
String res = "" + s.charAt(0);
for (int i = 1; i < s.length(); i++)
if (s.charAt(i-1) != s.charAt(i)) res += s.charAt(i);
return res;
}
private static String[] bvy9(String[] arr){
String [] res = new String[arr.length];
for (int i = 0; i < res.length; ++i)
res[i] = unDup1(arr[i]);
return res;
}
private static int random(int l, int u){
return random.nextInt(u-l)+l;
}
@Test
public void basicTests(){
assertArrayEquals(new String[]{"andrew","picaniny","hubububo"},Solution.dup(new String[]{"aaannnndddrreew","piccaninny","hubbubbubboo"}));
assertArrayEquals(new String[]{"abracadabra","alote","asese"},Solution.dup(new String[]{"abracadabra","allottee","assessee"}));
assertArrayEquals(new String[]{"keles","kenes"},Solution.dup(new String[]{"kelless","keenness"}));
}
@Test
public void randomTests(){
String abc = "abcdefghijklmnopqrstuvwxyzabcd";
for(int k=0;k<100;k++){
int arrLen = random(10,20);
int len = random(10,20);
int i = 0;
String [] res = new String[arrLen];
while (i < arrLen){
String st = "";
int j = 0;
while (j < len){
int ch = random(0,26);
st += abc.charAt(ch);
if (ch % 2 == 0) st+=abc.charAt(ch);
j++;
}
res[i] = st;
i++;
}
assertArrayEquals(bvy9(res),Solution.dup(res));
}
}
}