带有递归的回文;索引超出范围

时间:2014-12-20 12:48:42

标签: java recursion palindrome

我试图编写一个检查字符串变量是否为回文的函数。 我无法找到此代码抛出IndexOutOfBoundException的原因。我试图使用示例来跟踪结果,但我仍然无法查看异常的来源。

public static boolean palindrome(String s) {
    if (s.charAt(0) == s.charAt(s.length() - 1)) {
        if (s.length() > 2) {       
            StdOut.print(s.substring(1, s.length() - 2));
            palindrome(s.substring(1, s.length() - 2));
        } else
            return true;
    }
    return false;
}

4 个答案:

答案 0 :(得分:4)

palindrome最终可以使用空字符串调用自身。当发生这种情况时,第一行会在IndexOutOfBoundsException中提供s.charAt(0)

P.S。仔细观察,substring调用中的边界也是不正确的:因为结束索引是独占,所以第二个参数应该是s.length() - 1。你也需要解决这个问题。

答案 1 :(得分:2)

试试这个:

public static boolean palindrome(String s)
{
    if (s.length() < 2)
        return true;
    if (s.charAt(0) != s.charAt(s.length()-1))
        return false;
    return palindrome(s.substring(1,s.length()-1));
}

答案 2 :(得分:1)

您的子字符串错误。你要从最后删除一个额外的角色。

public static boolean palindrome(String s) {
    if (s.charAt(0) == s.charAt(s.length() - 1)) {
        if (s.length() > 2) {       
            StdOut.print(s.substring(1, s.length() - 1));
            palindrome(s.substring(1, s.length() - 1));
        } else
            return true;
    }
    return false;
}

答案 3 :(得分:1)

这里有几个问题:

  1. 如上所述,substring来电错误 - endIndex是独占的,因此您应该以{{1​​}}
  2. 结束
  3. 您正在调用s.length() - 1),然后继续使用该功能,最终返回palindrome - 相反,您应该返回应用false的结果子字符串:
  4. 因此,在考虑到这两个错误后,方法应如下所示:

    palindrome