2014-01-26 4 views
1

Я пытаюсь написать метод, который проверяет, является ли строка палиндром. Это то, что я до сих пор:Отладка метода рекурсивного палиндрома

public static boolean isPalindrome(String word) { 
    boolean flag = false; 

    if (word.length() < 2) { 
     flag = true; 
    } else if (word.charAt(0) == word.charAt(word.length() - 1)) { 
     flag = isPalindrome(word.substring(1, word.length() - 2)); 
    } 

    return flag; 
} 

Проблема Я бег в этом методе последовательно возвращает истину для строк вида "aaaba", где пара, которая должна привести к ложному быть распространяющимися обратно через стек находится в середине строки. Я ударяю головой о стену, пытаясь понять, где моя ошибка, но безрезультатно. Может быть, свежий набор глаз увидит то, что мне не хватает?

+0

Попробуйте использовать некоторые операторы для какие персонажи сравниваются каждый раз. Это должно помочь вам сузить область проблем. – csmckelvey

+0

Все это в отличие от 'return word.equals (new StringBuilder (word) .reverse(). ToString());'? –

+1

@JoshM Это полезное упражнение для рекурсии ... – Oleksiy

ответ

1

В вашем рекурсивном вызове, вы должны вычесть 1 из длины строки, а не 2:

// start index inclusive, end index exclusive 
flag = isPalindrome(word.substring(1, word.length() - 1)); 
+0

Спасибо за быстрый ответ. Да, я должен был это заметить. Спасибо, что указали! – aerophage

1

Измените endIndex в методе substring(startIndex, endIndex). Обратите внимание, что в соответствии с Java Docs:

общественности Строка подстрока (интермедиат beginIndex, внутр ENDINDEX) Возвращает новую строку, которая является подстрокой данной строки. Подстрока начинается с указанного beginIndex и продолжается до символа с индексом ENDINDEX - 1.

Изменить это:

word.substring(1, word.length() - 1) 

так, скажем word = "aaba", этот метод будет возвращать "ab".


Кроме того, вы можете упростить код, избавившись от flag и сразу возвращает результат:

public static boolean isPalindrome(String word) 
{ 
    if (word.length() < 2) { 
     return true; 
    } else if (word.charAt(0) == word.charAt(word.length() - 1)) { 
     return isPalindrome(word.substring(1, word.length() - 1)); 
    } else { 
     return false; 
    } 
} 
+0

Большое спасибо! Я знал, что это что-то простое, что я в конечном итоге пинаю себя за то, что не видел. – aerophage

1

Попробуйте это ....

public static boolean isPalindrome(String word) { 
if(word.length() == 0 || word.length() == 1) 
    return true; // If length is 0 or 1 then it is palindrome 

if(word.charAt(0) == word.charAt(word.length()-1)) 
    return isPalindrome(word.substring(1, word.length()-1)); 
    //Check the first and last char of the string if they are same 
    //then continue the same for a substring by removing the first 
    //and last character. And continue this until the string completes 

return false; //I fthe case doesn't match 

} 
+0

Это был индекс, который я использовал, и это было проблемой. Спасибо! – aerophage

Смежные вопросы