如何修复Java中的Palindrome程序中的错误?

问题描述 投票:0回答:3

我在回文计划中不断出错。代码如下:

public static boolean isPalindrome_r(String word){
    int beginning = 0;
    int end = word.length() - 1;

    if(word.charAt(beginning) == word.charAt(end)){
        return (isPalindrome_r(word.substring(1, word.length() - 1)));
    }
    else if (word.charAt(beginning) != word.charAt(end)){
        return false;
    }

    return false;
}

public static boolean isPalindrome_nr(String word){
    int beginning = 0;
    int end = word.length() - 1;

    boolean pd = true;

    for (int i = end; i>=0; i--){
        if(word.charAt(i) != word.charAt(end-i)){
            pd = false;
        }
    }

    return pd;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub

    System.out.println("Is the string a palindrome or not? ");
    String test = "test";
    String test_2 = "level";
    String test_3 = "application";
    System.out.println("Answer: " + isPalindrome_r(test));
    System.out.println("Answer: " + isPalindrome_r(test_2));
    System.out.println("Answer: " + isPalindrome_r(test_3));
    System.out.println("Answer: " + isPalindrome_nr(test));
    System.out.println("Answer: " + isPalindrome_nr(test_2));
    System.out.println("Answer: " + isPalindrome_nr(test_3));

}

关于递归版本上的test_2的错误输出是这样的:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at assignment1cs.recursion.isPalindrome_r(recursion.java:12)
at assignment1cs.recursion.isPalindrome_r(recursion.java:12)
at assignment1cs.recursion.isPalindrome_r(recursion.java:12)
at assignment1cs.recursion.main(recursion.java:80)

我该如何解决?

java string recursion boolean palindrome
3个回答
2
投票

您没有停止条件。如果剩余的String长度<4;

,则应终止递归。

如果长度为1,则返回true。如果长度为2或3,则如果first = last则返回true。


1
投票

尝试一下(重要的是不要忘记s.length()<2时的情况):

public static boolean isPalindrome(String s) {
        int length = s.length();
        if (s.isEmpty() || length == 1) 
            return true;
        return s.charAt(0) != s.charAt(length - 1) ? false : isPalindroma(s.substring(1,length - 1));
    }

0
投票

经过几轮执行后,由word.substring(1, word.length() - 1)生成的子字符串的长度可能为0。

因此,在您的递归的下一个迭代中:int end = word.length() - 1;将为-1并且word.charAt(beginning) == word.charAt(end)word.charAt(0) == word.charAt(-1),因此会导致您看到的运行时错误。

© www.soinside.com 2019 - 2024. All rights reserved.