Я искал решение, которое бы работало не только для палиндромов, таких как ...
... но и для ...
- «Человек, план, канал, Панама!»
- «Я видел машину или кота?»
- "Нет" х "в Никсоне"
Итеративный : Это оказалось хорошим решением.
private boolean isPalindromeIterative(final String string)
{
final char[] characters =
string.replaceAll("[\\W]", "").toLowerCase().toCharArray();
int iteratorLeft = 0;
int iteratorEnd = characters.length - 1;
while (iteratorEnd > iteratorLeft)
{
if (characters[iteratorLeft++] != characters[iteratorEnd--])
{
return false;
}
}
return true;
}
Рекурсивный . Я думаю, что это решение не должно быть намного хуже, чем итеративное. Это небольшая дрянь, нам нужно извлечь шаг очистки из метода, чтобы избежать ненужной обработки.
private boolean isPalindromeRecursive(final String string)
{
final String cleanString = string.replaceAll("[\\W]", "").toLowerCase();
return isPalindromeRecursiveRecursion(cleanString);
}
private boolean isPalindromeRecursiveRecursion(final String cleanString)
{
final int cleanStringLength = cleanString.length();
return cleanStringLength <= 1 || cleanString.charAt(0) ==
cleanString.charAt(cleanStringLength - 1) &&
isPalindromeRecursiveRecursion
(cleanString.substring(1, cleanStringLength - 1));
}
Реверс : Это оказалось дорогостоящим решением.
private boolean isPalindromeReversing(final String string)
{
final String cleanString = string.replaceAll("[\\W]", "").toLowerCase();
return cleanString.equals(new StringBuilder(cleanString).reverse().toString());
}
Все благодарности парням, отвечающим в этом посте и освещающим тему.