Проверка строки палиндром в Java не работает? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь написать программу для этих инструкций:

По заданной строке определите, является ли она палиндромом, учитывая только буквенно-цифровые символы и игнорируя регистры. Примечание. Для решения этой проблемы мы определяем пустой String как действительный палиндром. https://leetcode.com/problems/valid-palindrome/

По какой-то причине .reverse() в последней строке не меняет его. Я попытался отладить, добавив операторы print, и я вижу, что строка ДЕЙСТВУЕТ ранее. Что здесь происходит? Пожалуйста, ведите меня!

public static boolean isPalindrome(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if (Character.isLetter(s.charAt(i))) {
            sb.append(s.charAt(i));
        }
    }
    String x = sb.reverse().toString();
    System.out.println(x);
    if (sb.length() == 0) 
        return true;
    else 
        return sb.toString().equals(x);
}

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Потому что после первого вызова sb.reverse() sb изменило свое состояние.

0 голосов
/ 11 января 2019

Проблема в том, что reverse() изменяет сам StringBuilder. Итак, вы сравниваете обратное с обратным. Вместо этого измените свой метод на:

String x = sb.toString();
return sb.reverse().toString().equals(x);

Что будет сравнивать StringBuilder перед реверсом с реверсированным StringBuilder. Обратите внимание, что if(sb.length == 0) не требуется, так как если он пуст, sb.reverse().toString().equals(x) все равно вернет true.

Также ваш поиск чувствителен к регистру, когда в заявлении о проблеме говорится, что он должен совпадать независимо от регистра. Измените, где вы добавляете:

if (Character.isLetter(s.charAt(i))) {               
     sb.append(Character.toLowerCase(s.charAt(i)));
}

Также вы можете воспользоваться replaceAll и toLowerCase(), чтобы сократить ваш метод до:

public static boolean pali(String s) {
    String copy = s.toLowerCase().replaceAll("[^a-z]", "");
    return new StringBuilder(copy).reverse().toString().equals(copy);       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...