递归删除相邻的重复项

时间:2019-06-19 04:10:01

标签: java

问题是从字符串中删除相邻的重复元素,执行一次后给出

  

java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:   14

我尝试调试,但是在执行第一次递归后,代码执行立即结束。

import java.util.*;
import java.lang.*;

public class RemoveAdjacent {
    public static void main(String[] args) {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        String s = "geeksforgeeks";
        removeDuplicate(s, 0);
    }

    public static void removeDuplicate(String d, int i) {
        int n = d.length();
        if (d.charAt(i) == d.charAt(i + 1) && i <= n) {
            d = d.substring(0, i) + d.substring(i + 1, n + 1);
            i = i + 1;
            removeDuplicate(d, i);
        } else if (i <= n) {
            i = i + 1;
            removeDuplicate(d, i);
        } else {
            System.out.println(d);
            return;
        }
    }
}
    at java.lang.String.substring(String.java:1963)
String.java:1963
    at RemoveAdjacent.removeDuplicate(RemoveAdjacent.java:16)
RemoveAdjacent.java:16
    at RemoveAdjacent.removeDuplicate(RemoveAdjacent.java:21)
RemoveAdjacent.java:21
    at RemoveAdjacent.main(RemoveAdjacent.java:10)

2 个答案:

答案 0 :(得分:3)

您非常亲密,但需要修复一些问题。

  • 您需要重新排列if语句的顺序,以便正确检查边界。

    注意:严格来说,重新排序不是必需的,但是它使您进行递归的基本情况更加清楚。

  • 您不想在第一条if语句中执行d.substring(i + 1, n + 1)。那就是说:

      

    请给我从i + 1end + 1的字符串

    哪个无效。您只需忽略第二个参数,它将自动使用结尾。

  • 如果当前字符等于下一个字符,则您要删除该字符,但不希望递增i,因为新字符刚刚取代了先前的字符,现在需要检查。

类似的事情应该起作用:

import java.util.*;
import java.lang.*;

public class Main {
    public static void main(String[] args) {
        String s = "gggggeeksfooorrrrgggeeeeksssss";
        removeDuplicate(s, 0);
    }

    public static void removeDuplicate(String d, int i) {
        int n = d.length();
        if (i >= n-1){
            System.out.println(d);
        } else if (d.charAt(i) == d.charAt(i + 1)) {
            d = d.substring(0, i) + d.substring(i + 1);
            removeDuplicate(d, i);
        } else{
            i = i + 1;
            removeDuplicate(d, i);
        }
    }
}

答案 1 :(得分:1)

可能,您应该看看substring方法的作用。 Link到方法签名。

如果您注意到,第二个参数是结束索引(不包括)。在第16行,您提供的第二个参数为n+1,它将始终超出范围。您可以将第二个参数设置为n,或者不提供第二个参数,在这种情况下将调用method。此外,第15行的检查不正确。类似于下面的代码将起作用:

public static void removeDuplicate(String d, int i) {
    int n = d.length();
    if (i+1 < n && d.charAt(i) == d.charAt(i + 1)) {
        d = d.substring(0, i) + d.substring(i + 1);
        removeDuplicate(d, i);
    } else if (i <= n) {
        i = i + 1;
        removeDuplicate(d, i);
    } else {
        System.out.println(d);
    }
}

请注意,不需要代码中的第17行,因为这只会删除相邻的重复字符和后续的重复字符。另外,在return块中不需要else语句。希望这会有所帮助。