回文StackOverflow错误

时间:2016-10-08 04:13:33

标签: java algorithm recursion palindrome

我尝试使用递归来解决回文问题。我在线程“main”java.lang.StackOverflowError中得到了一个Exception     at java.lang.String.substring(String.java:1969)     在Main.isPalindrome(Main.java:160)

但是,我不知道如何解决它。

public static boolean isPalindrome(String s) {
        int len = s.length();
        if (len <= 1) return true;
        else {
            char ch1 = Character.toLowerCase(s.charAt(0));
            char ch2 = Character.toLowerCase(s.charAt(len - 1));
            boolean check1 = Character.isLetter(ch1) || Character.isDigit(ch1);
            boolean check2 = Character.isLetter(ch2) || Character.isDigit(ch2);
            if (check1 && check2) {
                if (ch1 == ch2) {
                    String shorter = s.substring(1, len - 1);
                    return isPalindrome(shorter);
                }
                else {
                    return false;
                }
            }
            else if (!check1 && check2) {
                String shorter = s.substring(1);
                return isPalindrome(shorter);
            }
            else if (!check2 && check1) {
                String shorter = s.substring(0, len - 1);
                return isPalindrome(shorter);
            }
            else {
                String shorter = s.substring(1, len - 1);
                return isPalindrome(shorter);
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

如果不确切知道哪一行是160,很难说。那就是说,你可能用与方法本身相同的参数来调用它,因此没有什么可以结束你的递归。

答案 1 :(得分:0)

你的逻辑没有错。只是存在有限的内存来保持堆栈帧,因此有限的递归级别。当输入字符串足够大时,将抛出StackOverflowError

我的建议是放弃这种递归实现,而是使用循环。