Перевірте, чи є рядок паліндром на 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 під час перевірки на наявність паліндромів, або ми можемо повернути рядок назад без цих класів.

Давайте спочатку розглянемо реалізації коду без допоміжних 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 () із API StringBuilder та 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)); }

У наведеному вище фрагменті ми перевіряємо, що жодна з пар символів з кожного кінця рядка не відповідає умові предиката .

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.