Валидный палиндром с удалением одного символа

Дана непустая строка 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;
    }
}

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком