这是我的代码:
public static String removeAdjDuplicates(String s) {
if(s == "" || s == null || s.isEmpty())
return s;
if(s.length() < 2)
return s;
if(s.charAt(0) != s.charAt(1))
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));
if(s.charAt(0) == s.charAt(1)) //line 37
return removeAdjDuplicates(s.substring(2));
return s;
}
输入字符串“ull”,我收到以下错误:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:658)
at GFG.removeAdjDuplicates(File.java:37)
at GFG.main(File.java:16)
我阅读并尝试了类似问题的答案,但我不确定是什么问题。
答案 0 :(得分:3)
从您获得的异常判断,removeAdjDuplicates
返回一个空字符串,使所有索引在零之后失效。
虽然您的代码在顶部执行长度检查,但当两个初始字符不同时,它也会执行此分配:
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));
这意味着如果s
返回空字符串,removeAdjDuplicates
可以成为单字符字符串。
答案 1 :(得分:1)
我认为@dasblinkenlight's answer充分解释了错误的来源。
虽然问题中没有明确说明,但您似乎试图以递归方式删除相邻的重复字母(您的一条评论提到您希望输入s
输出geegs
。)< / p>
这是另一种方法:
while(!s.equals(s = s.replaceAll("(.)\\1", "")));
它使用正则表达式来匹配和删除重复的字符,而while循环继续执行此操作,直到操作不再修改字符串。
答案 2 :(得分:1)
当您尝试将此字符串“ull”传递给方法时,字符串中的最后一个字母应为字母“u”,因为您使用此
if(s.charAt(0) != s.charAt(1))
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));
因为你没有像方法中的其他条件一样返回String,它将继续到第37行的下一个条件 并且你只有一个字母,而条件检查第一个和第二个字符...没有第二个字母,所以你得到这个错误..所以解决方案是返回这样的
if(s.charAt(0) != s.charAt(1)){
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));
return s;
}
答案 3 :(得分:0)
您应该简化代码:
public static String removeAdjDuplicates(String s) {
if (s == null || s.length() < 2)
return s;
if (s.charAt(0) != s.charAt(1))
return s.charAt(0) + removeAdjDuplicates(s.substring(1));
return removeAdjDuplicates(s.substring(2));
}
if
语句执行相同的操作(return s;
),可以组合成一个。有些条件是多余的,可以消除。if
语句应立即return
而不是继续进入第四个if语句(或者您可以将第四个if
语句更改为else
),因为当第四个removedAdjDuplicates
期望至少长度为两个String
时,s
可以返回一个空的String
if
长度为String
if
(s.charAt(0) != s.charAt(1))
,因为如果if
在第三个(s.charAt(0) == s.charAt(1))
中失败,那么唯一的选择就是progress
,因此对此进行的检查不是&#39} ;必要的。