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, за да обърнем дадения 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.