简体   繁体   English

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

[英]How to remove adjacent duplicates in a string in Java

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. 我已经找到了许多使用HashSet或LinkedHashSet删除重复项的解决方案,但它们都删除了所有重复项,我只在寻找相邻的重复项。 " Say a string is "ABBCDAABBBBBBBBOR" The required result should be "ABCDABOR" and not "ABCDOR". Could this be achived in O(n) ? Thanks. “说一个字符串是“ ABBCDAABBBBBBBBBBOR”所需的结果应该是“ ABCDABOR”而不是“ ABCDOR”。能否在O(n)中实现?谢谢。

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

O(n) time solution : 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();
}

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: 或者,如果这更适合您的样式,而不是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]));

This is a complete solution using Java. 这是使用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. 如果您不想使用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

}

The solution in Python: Python解决方案:

a = "GiniiiiGinaaaPrrrottiijayi"

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM