Java 如何使用递归删除连续的重复项?

Java 如何使用递归删除连续的重复项?,java,recursion,duplicate-removal,Java,Recursion,Duplicate Removal,我需要使用递归方法从字符串中删除连续的重复项(例如,将“aabbcddeghi”转换为“abcdefghi”) 如果我有注释的removeDuplicates()行,我会得到一个带有数字的奇怪输出,这个异常: 如果我注释掉该行,它只打印: a 这是我的密码: package recursion; public class recursion { public static void main(String[] args){ removeDuplicates("aab

我需要使用递归方法从字符串中删除连续的重复项(例如,将“aabbcddeghi”转换为“abcdefghi”)

如果我有注释的
removeDuplicates()
行,我会得到一个带有数字的奇怪输出,这个异常:

如果我注释掉该行,它只打印:

a
这是我的密码:

package recursion;

public class recursion {

    public static void main(String[] args){
        removeDuplicates("aabbcddefghhi", 0, 1);
    }

    public static void removeDuplicates(String a, int b, int c){
        if (a.length() <= 1){
            System.out.print(a.charAt(b));
        }
        else if (a.charAt(b) == a.charAt(c)){
            System.out.print(a.charAt(c));
            b++;
            c++;
            //removeDuplicates(a,b,c);
        }
        else if (a.charAt(b) != a.charAt(c)){
            System.out.print(a.charAt(b) + a.charAt(c));
            b++;
            c++;
            removeDuplicates(a,b,c);
        }
        else{
            System.out.print("");
            b++;
            c++;
            removeDuplicates(a,b,c);
        }
    }
}
包递归;
公共类递归{
公共静态void main(字符串[]args){
移除的副本(“aabbcddefghhi”,0,1);
}
移除的公共静态无效副本(字符串a、整数b、整数c){

如果(a.length()您对此代码有一些问题:

  • 您没有终止递归的好方法。您实际上没有减少字符串的大小,因此初始结束条件将不起作用
  • 您没有根据此处使用的逻辑打印字符串的最后一个字符的案例
  • 您的最终if条件将永远不会发生
  • 你永远不想把两个字符加在一起。在这种情况下,你也不想同时打印两个字符
  • 如果两个字符匹配,您不想打印字符,因为您不知道还有多少个字符
  • 您不需要有
    c
    值,它总是等于
    b+1
    ,只需使用一个数字即可
  • 下面是所有这些更改的结果代码:

    public static void main(String[] args) {
      removeDuplicates("a");
      System.out.println();
      removeDuplicates("aabbcdddefghhii");
      System.out.println();
      removeDuplicates("aabbcdefa");
    }
    
    public static void removeDuplicates(String a) {
       removeDuplicatesHelper(a, 0);
    }
    
    public static void removeDuplicatesHelper(String a, int b) {
      if (b == a.length() - 1) {
        System.out.print(a.charAt(b));
      } else if (a.charAt(b) == a.charAt(b+1)) {
        b++;
        removeDuplicatesHelper(a, b);
      } else {
        System.out.print(a.charAt(b));
        b++;
        removeDuplicatesHelper(a, b);
      }
    }
    
    输出:

    a
    abcdefghi
    abcdefa
    
    称为:

    public static void main(String[] args) {
        System.out.println(duplicates("aabbbbbb976fkkkkc", '\0'));
    }
    

    您遇到的具体问题是什么?请用这些信息回答您的问题。建议阅读:如果我将字符串更改为类似“aabbcdefa”的内容,以便它输出“abcdefa”,是否有办法使其工作?在某个点上,“f”会被删除。我假设在第一个“else if”中会发生这种情况,因为“a.length()-1”,但是a!=f,所以它不应该被删除。(现在是12:17,所以我可能会被剥夺睡眠并误读它,但我不完全理解。)如果我去掉int参数,我将如何修复它?我在方法之外声明b为静态变量,并将其设置为a.length()。我得到一个StringIndexOutOfBounds异常,不管我是否保留它,加上或减去1。我也用RemovedUpplicates方法处理过这些数字。我肯定这是我明显缺少的东西。即使只是将我指向正确的方向也会有所帮助。我也尝试了从0开始的b。这并没有打印出所需的result也是。我刚被告知在RemovedUpplicates方法中将其更改为仅包含一个字符串参数。必须进行哪些更改?或者是否有其他方法可以更改它?(很抱歉一直打扰您)。我们还没有在我的类中了解尾部递归,所以我不知道是否应该使用它。反正它给了我一个错误。
     public static String duplicates(String word, char curr) {
    
        if (word.length() == 0) return "";
    
        char next = word.charAt(0);
    
        if (word.length() == 1) {
           return curr == next ? "" : word;
        }
    
        if (curr != next) {
             return next + duplicates(word.substring(1), next);
        }
        else {
            return duplicates(word.substring(1), curr);
        }
     }
    
    public static void main(String[] args) {
        System.out.println(duplicates("aabbbbbb976fkkkkc", '\0'));
    }