删除字符串中的重复字符

时间:2016-08-19 14:23:15

标签: java string

我正在查看破解编码书中的“编写代码以删除字符串中的重复字符而不使用任何其他缓冲区”的问题。

我已经用书中的解决方案编写了一个程序:

public class test {
    public static void main(String[] args) {
        String str = "aaabbb";
        char[] charArray = str.toCharArray();
        System.out.println(charArray);
        remove_V(charArray);
        System.out.println(charArray);
    }

    public static void remove_V(char[] str) {
        if (str == null) return;
        int len = str.length;
        if (len < 2) return;
        int tail = 1;
        for (int i = 1; i < len; ++i) {
            int j;
            for (j = 0; j < tail; ++j) {
                if (str[i] == str[j]) break;
            }
            if (j == tail) {
                str[tail] = str[i];
                ++tail;
            }
        }
        str[tail] = 0;
    }

}

我用“aaabbb”测试了程序,但我得到的输出是“abbb”。这是否意味着程序错了?

2 个答案:

答案 0 :(得分:0)

问题是remove_V方法的最后一个命令。您正在使用&#39; 0&#39;只是str数组的最后一个位置由tail的最后一个值决定。实际上,有必要清理所有尾部位置,i。例如,从对应于尾部的最后一个值的位置到通过str数组(len-1)的最后一个位置。所以,改变

str[tail] = 0;

这样的事情

for (int i = tail; i < len; ++i)
    str[i] = 0;

答案 1 :(得分:0)

在这种情况下,你可以使用java charAt()和一个for循环,你不需要两个for循环和if块。

你需要用两件事来简化逻辑。 一个前一个值 - 将前一个char存储在其中 if to block to存储不等于前一个char的char值。

public static void main(String[] args) {
    String str = "aaabbb";
    String str2 = "aaabbkkbmoouse";
    System.out.println(remDup(str));
    System.out.println(remDup(str2));
}

public static String remDup(String str){
    String res = "";  // final resulting groups of chars
    char prev = '-';
    for(int i = 0; i < str.length(); i++){
        if (str.charAt(i) != prev) {  // not equal to previous to store to previous and add to results.
            prev = str.charAt(i);
            res += prev;
        }

    }
    return res;
}
  

输出

     

str:ab

     

str2:abkbmouse