Валидный палиндром с удалением одного символа
Дана непустая строка s, в которой можно удалить 0 или 1 символ. Выяснить, можно ли таким образом получить палиндром.
Пример 1:
Дано: "aba" Результат: True
Пример 2:
Дано: "abca" Результат: True Пояснение: Чтобы получился палиндром, можно удалить символ 'c'.
Примечания:
Строка состоит из букв нижнего регистра a-z. Максимальная длина строки равна 50000.
Идея решения:
Палиндром - это строка, которая читается одинаково, как слева направо, так и справа налево. Типовая проверка палиндрома состоит в том, что мы просматриваем символы одновременно слева и справа, два указателя движутся навстречу друг к другу, пока не встретятся.
В нашей задаче допускается вариант, что есть какой-то лишний символ. В таком случае, просматривая строку на предмет палиндрома, возникнет ситуация, когда символ справа не равен символу слева. В таком случае нам нужно рассмотреть два варианта:
- если мы удалим символ справа, то получится палиндром?
- если мы удалим символ слева, то получится палиндром?
Если ответ хотя бы на один из этих двух вопросов "да", то наш ответ true. Иначе, ответ false.
Имплементация
class Solution {
public boolean isPalindromeRange(String s, int i, int j) {
for (int k = i; k <= i + (j - i) / 2; k++) {
if (s.charAt(k) != s.charAt(j - k + i)) return false;
}
return true;
}
public boolean validPalindrome(String s) {
for (int i = 0; i < s.length() / 2; i++) {
if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {
int j = s.length() - 1 - i;
return (isPalindromeRange(s, i+1, j) ||
isPalindromeRange(s, i, j-1));
}
}
return true;
}
}
Комментарии
Отправить комментарий