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

1. Введение

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

Палиндром - это слово, фраза, число или другие последовательности символов, которые читаются так же, как вперед и назад , например «мадам» или «гоночная машина».

2. Решения

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

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

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

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); }

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

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

Такого же поведения можно добиться с помощью методов 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 () из StringBuilder и StringBuffer API, чтобы обратить данную строку и проверить равенство.

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. Использование рекурсии

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

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. Заключение

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

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