Палиндромы

Базовый Algorithms
≈ 2 мин чтения

Сравниваем строку с двух концов

Палиндром читается одинаково слева направо и справа налево. Создавать развёрнутую копию строки для проверки не обязательно: достаточно сравнивать симметричные символы двумя указателями.

static boolean isPalindrome(String text) {
    int left = 0;
    int right = text.length() - 1;

    while (left < right) {
        if (text.charAt(left) != text.charAt(right)) {
            return false;
        }
        left++;
        right--;
    }

    return true;
}

Если хотя бы одна пара различается, ответ уже известен и алгоритм завершается. В худшем случае будет проверена примерно половина пар символов, поэтому время — O(n), а дополнительная память — O(1).

Проверка части строки

Во многих задачах нужно проверить не всю строку, а диапазон между двумя индексами. Тогда полезно сразу передавать его границы в функцию, не создавая отдельную подстроку.

static boolean isPalindrome(String text, int left, int right) {
    while (left < right) {
        if (text.charAt(left++) != text.charAt(right--)) {
            return false;
        }
    }
    return true;
}

Такой вариант удобно повторно использовать внутри более крупных алгоритмов: границы уже определяют нужный фрагмент, а лишний объект String не создаётся.

Условия задачи могут менять правило сравнения

Иногда регистр букв нужно игнорировать, а пробелы и знаки препинания — пропускать. Тогда два указателя остаются на месте как идея, но перед сравнением каждый из них сдвигается до следующего значимого символа. Важно следовать именно правилам конкретной задачи, а не автоматически нормализовать любую строку.

Пустая строка и строка из одного символа — палиндромы. В них нет пары позиций, которая могла бы нарушить симметрию, поэтому цикл с условием left < right сразу завершится успешно.