How to remove adjacent duplicates in a string in Java

放肆的年华 提交于 2020-01-15 10:09:37

问题


I've been looking for this answer for a while. I've found numbers of solutions for removing duplicates using a HashSet or LinkedHashSet but they all remove all duplicates, I'm looking for only the adjacent ones. " Say a string is "ABBCDAABBBBBBBBOR" The required result should be "ABCDABOR" and not "ABCDOR". Could this be achived in O(n) ? Thanks.


回答1:


Sure:

StringBuilder sb = new StringBuilder();
char[] chars = text.toCharArray();
char previous = chars[0];
sb.append(chars[0]);
for(int i = 1 ; i < chars.length ; i++) {
    if(chars[i] != previous) {
        sb.append(chars[i]);
        previous = chars[i];
    }
}
String res = sb.toString();



回答2:


I'm just starting to work with streams so bear with me...

public static String removeAdjacentDuplicates(String input) {
    if (input.length() <= 1) {
        return input;
    }

    StringBuilder sb = new StringBuilder();
    sb.append(input.charAt(0));

    IntStream.range(1, input.length())
        .mapToObj(i -> input.charAt(i) != input.charAt(i - 1) ? input.charAt(i) : "")
        .forEach(sb::append);

    return sb.toString();
}

or if this more your style instead of the StringBuilder:

return input.charAt(0) + String.join("", 
    IntStream.range(1, input.length())
        .mapToObj(i -> input.charAt(i) != input.charAt(i - 1) ?
            String.valueOf(input.charAt(i)) : "")
        .toArray(size -> new String[size]));



回答3:


O(n) time solution :

public String removeAdjacentDuplicates(String s) {
    StringBuilder resultBuilder = new StringBuilder();
    char previous = s.charAt(0);
    resultBuilder.append(previous);
    for (int i = 1; i < s.length(); i++) {
        char current = s.charAt(i);
        if (previous != current) {
            resultBuilder.append(current);
            previous = current;
        }
    }
    return resultBuilder.toString();
}



回答4:


This is a complete solution using Java.

public class Occurence2 {

    public static void main(String[] args) {
        // String a = "ABBCDAABBBBBBBBOR"; //ABCDABOR
        String a = "GiiinnnniiiiiGinnnaPrrooottijayyyi";//GiniGinaProtijayi
        fix(a);
    }// amin

    private static void fix(String a) {
        StringBuffer sbr = new StringBuffer();
        for (int i = 0; i < a.length(); i++) {
            char ch = a.charAt(i);
            if (sbr.length() == 0) {
                sbr.append(ch);
            }
            if (ch == sbr.charAt(sbr.length() - 1)) {
                i++;
            } else {
                sbr.append(ch);
            }
        }
        System.out.println(sbr);
    }// fiix
}

If you don't want to use StringBuffer, then you can simply use an empty string.

public class Test6 {
public static void main(String[] args) {
    String a = "GiiinnnniiiiiGinnnaPrrooottijayyyi";
    fix(a);
    }

private static void fix(String a) {
      String res = "";
    int i = 0 ;
     while(i < a.length()) {
         char ch = a.charAt(i);
         if(res.length() == 0 ) {res += ch ;}
         if(ch == res.charAt(res.length() -1)) {i++ ;}
         if(ch != res.charAt(res.length() -1)) {res += ch ;}
     }//while
      System.out.println(res);
}//fix

}

The solution in Python:

a = "GiniiiiGinaaaPrrrottiijayi"

reslist =[]
for ch in a:
     if(len(reslist) == 0 or ch != reslist[-1]):reslist.append(ch)

print(reslist)
print(''.join(reslist))   


来源:https://stackoverflow.com/questions/40917393/how-to-remove-adjacent-duplicates-in-a-string-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!