Вопрос-ответ

Check string for palindrome

Проверка строки на наличие палиндрома

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

Чтобы проверить, является ли слово палиндромом, я получаю массив символов слова и сравниваю символы. Я протестировал это, и, кажется, это работает. Однако я хочу знать, правильно ли это или есть что улучшить.

Вот мой код:

public class Aufg1 {
public static void main(String[] args) {
String wort = "reliefpfpfeiller";
char[] warray = wort.toCharArray();
System.out.println(istPalindrom(warray));
}

public static boolean istPalindrom(char[] wort){
boolean palindrom = false;
if(wort.length%2 == 0){
for(int i = 0; i < wort.length/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}else{
for(int i = 0; i < (wort.length-1)/2-1; i++){
if(wort[i] != wort[wort.length-i-1]){
return false;
}else{
palindrom = true;
}
}
}
return palindrom;
}
}
Переведено автоматически
Ответ 1

Почему бы просто не:

public static boolean istPalindrom(char[] word){
int i1 = 0;
int i2 = word.length - 1;
while (i2 > i1) {
if (word[i1] != word[i2]) {
return false;
}
++i1;
--i2;
}
return true;
}

Пример:

Входные данные - "andna".
i1 будет равно 0, а i2 - 4.

Первую итерацию цикла мы сравним word[0] и word[4]. Они равны, поэтому мы увеличиваем i1 (теперь это 1) и уменьшаем i2 (теперь это 3).
Затем мы сравниваем n. Они равны, поэтому мы увеличиваем i1 (теперь это 2) и уменьшаем i2 (это 2).
Теперь i1 и i2 равны (они оба равны 2), поэтому условие для цикла while больше не выполняется, поэтому цикл завершается, и мы возвращаем true .

Ответ 2

Вы можете проверить, является ли строка палиндромом, сравнив ее с обратной ей:

public static boolean isPalindrome(String str) {
return str.equals(new StringBuilder(str).reverse().toString());
}

или для версий Java более ранних, чем 1.5,

public static boolean isPalindrome(String str) {
return str.equals(new StringBuffer().append(str).reverse().toString());
}

РЕДАКТИРОВАТЬ: @FernandoPelliccioni предоставил очень тщательный анализ эффективности (или ее отсутствия) этого решения, как с точки зрения времени, так и с точки зрения пространства. Если вас интересует вычислительная сложность этого и других возможных решений этого вопроса, пожалуйста, прочтите его!

Ответ 3

Краткая версия, которая не требует (неэффективно) инициализации множества объектов:

boolean isPalindrome(String str) {    
int n = str.length();
for( int i = 0; i < n/2; i++ )
if (str.charAt(i) != str.charAt(n-i-1)) return false;
return true;
}
Ответ 4

В качестве альтернативы, рекурсия.

Для всех, кто ищет более короткое рекурсивное решение, чтобы проверить, удовлетворяет ли данная строка палиндрому:

private boolean isPalindrome(String s) {
int length = s.length();

if (length < 2) // If the string only has 1 char or is empty
return true;
else {
// Check opposite ends of the string for equality
if (s.charAt(0) != s.charAt(length - 1))
return false;
// Function call for string with the two ends snipped off
else
return isPalindrome(s.substring(1, length - 1));
}
}

ИЛИ даже короче, если хотите:

private boolean isPalindrome(String s) {
int length = s.length();
if (length < 2) return true;
return s.charAt(0) != s.charAt(length - 1) ? false :
isPalindrome(s.substring(1, length - 1));
}
java arrays string