问题是从字符串中删除相邻的重复元素,执行一次后给出
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)
答案 0 :(得分:3)
您非常亲密,但需要修复一些问题。
您需要重新排列if语句的顺序,以便正确检查边界。
注意:严格来说,重新排序不是必需的,但是它使您进行递归的基本情况更加清楚。
您不想在第一条if语句中执行d.substring(i + 1, n + 1)
。那就是说:
请给我从
i + 1
到end + 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
语句。希望这会有所帮助。