这是我的代码:
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)我阅读并尝试回答类似的问题,但我不知道哪里出了问题。
发布于 2017-01-05 04:38:06
当您尝试将这个字符串"ull"传递给该方法时,字符串中的最后一个字母应该是字母"u“,因为您使用了以下命令
if(s.charAt(0) != s.charAt(1))
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));由于不像方法中的其他条件那样返回字符串,它将继续到第37行的下一个条件,而u只有一个字母,而检查第一个和第二个字符的条件.没有第二个字母了,所以你得到了这个错误。因此,解决方案是像这样返回s
if(s.charAt(0) != s.charAt(1)){
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));
return s;
}发布于 2017-01-05 03:59:39
从您得到的异常判断,removeAdjDuplicates返回一个空字符串,使所有超过零的索引无效。
虽然代码在顶部执行长度检查,但当两个初始字符不同时,它也会执行此赋值:
s = s.charAt(0) + removeAdjDuplicates(s.substring(1));这意味着如果s返回一个空字符串,removeAdjDuplicates可以成为一个单字符字符串。
发布于 2017-01-05 04:36:23
我认为@dasblinkenlight's answer充分解释了错误的来源。
虽然问题中没有明确说明,但似乎您试图递归地删除相邻的重复字母(其中一条注释提到您希望输出s用于输入geegs)。
以下是另一种方法:
while(!s.equals(s = s.replaceAll("(.)\\1", "")));它使用正则表达式来匹配和删除重复字符,while循环将一直执行此操作,直到字符串不再被操作修改为止。
https://stackoverflow.com/questions/41477037
复制相似问题