Проверьте, является ли строка палиндромом

Проверьте, является ли строка палиндромом

1. Вступление

В этой статье мы увидим, как с помощью Java проверить, является ли данныйString палиндромом.

A palindrome is a word, phrase, number, or other sequences of characters which reads the same backward as forward, например «мадам» или «гоночный автомобиль».

2. Решения

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

2.1. Простой подход

Мы можем одновременно начать итерацию данногоstring вперед и назад, по одному символу за раз. Если есть совпадение, цикл продолжается; в противном случае цикл завершается:

public boolean isPalindrome(String text) {
    String clean = text.replaceAll("\\s+", "").toLowerCase();
    int length = clean.length();
    int forward = 0;
    int backward = length - 1;
    while (backward > forward) {
        char forwardChar = clean.charAt(forward++);
        char backwardChar = clean.charAt(backward--);
        if (forwardChar != backwardChar)
            return false;
    }
    return true;
}

2.2. Переворачивая строку

Есть несколько различных реализаций, которые подходят для этого варианта использования: мы можем использовать методы API из классовStringBuilder иStringBuffer при проверке палиндромов, или мы можем изменитьString без них. классы.

Давайте сначала посмотрим на реализации кода без вспомогательных API:

public boolean isPalindromeReverseTheString(String text) {
    StringBuilder reverse = new StringBuilder();
    String clean = text.replaceAll("\\s+", "").toLowerCase();
    char[] plain = clean.toCharArray();
    for (int i = plain.length - 1; i >= 0; i--) {
        reverse.append(plain[i]);
    }
    return (reverse.toString()).equals(clean);
}

В приведенном выше фрагменте мы просто перебираем заданныйString от последнего символа и добавляем каждый символ к следующему символу, вплоть до первого символа, тем самым меняя заданныйString.

Наконец, мы проверяем равенство между заданнымString и обратнымString.

Такое же поведение может быть достигнуто с помощью методов API.

Давайте посмотрим на небольшую демонстрацию:

public boolean isPalindromeUsingStringBuilder(String text) {
    String clean = text.replaceAll("\\s+", "").toLowerCase();
    StringBuilder plain = new StringBuilder(clean);
    StringBuilder reverse = plain.reverse();
    return (reverse.toString()).equals(clean);
}

public boolean isPalindromeUsingStringBuffer(String text) {
    String clean = text.replaceAll("\\s+", "").toLowerCase();
    StringBuffer plain = new StringBuffer(clean);
    StringBuffer reverse = plain.reverse();
    return (reverse.toString()).equals(clean);
}

Во фрагменте кода мы вызываем методreverse() из APIStringBuilder иStringBuffer, чтобы изменить данныйString и проверить равенство.

2.3. ИспользованиеStream API

Мы также можем использоватьIntStream, чтобы предоставить решение:

public boolean isPalindromeUsingIntStream(String text) {
    String temp  = text.replaceAll("\\s+", "").toLowerCase();
    return IntStream.range(0, temp.length() / 2)
      .noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1));
}

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

2.4. Использование рекурсии

Рекурсия - очень популярный метод для решения подобных проблем. В продемонстрированном примере мы рекурсивно перебираем заданныйString и проверяем, является ли это палиндромом или нет:

public boolean isPalindromeRecursive(String text){
    String clean = text.replaceAll("\\s+", "").toLowerCase();
    return recursivePalindrome(clean,0,clean.length()-1);
}

private boolean recursivePalindrome(String text, int forward, int backward) {
    if (forward == backward) {
        return true;
    }
    if ((text.charAt(forward)) != (text.charAt(backward))) {
        return false;
    }
    if (forward < backward + 1) {
        return recursivePalindrome(text, forward + 1, backward - 1);
    }

    return true;
}

3. Заключение

В этом кратком руководстве мы увидели, как узнать, является ли данныйString палиндромом или нет.

Как всегда, доступны примеры кода для этой статьиover on GitHub.