删除相邻的重复字母时的StringIndexOutOfBounds

时间:2017-01-05 03:49:21

标签: java string recursion

这是我的代码:

 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)

我阅读并尝试了类似问题的答案,但我不确定是什么问题。

4 个答案:

答案 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} ;必要的。