如何在Java中删除字符串中的相邻重复项

时间:2016-12-01 18:00:57

标签: java string duplicates

我一直在寻找这个答案。 我已经找到了许多使用HashSet或LinkedHashSet删除重复项的解决方案,但它们都删除了所有重复项,我只查找相邻的重复项。 " 说一个字符串是" ABBCDAABBBBBBBBOR" 所需的结果应该是" ABCDABOR"而不是" ABCDOR"。 这可以在O(n)中实现吗?感谢。

4 个答案:

答案 0 :(得分:3)

不确定

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();

答案 1 :(得分:1)

O(n)时间解决方案:

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();
}

答案 2 :(得分:1)

我刚刚开始使用溪流,所以请耐心等待......

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();
}

或者如果这更像你的风格而不是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 :(得分:1)

这是一个使用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
}

如果您不想使用StringBuffer,那么您只需使用空字符串。

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

}

Python中的解决方案:

a = "GiniiiiGinaaaPrrrottiijayi"

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

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