Проверьте строку на палиндром - PullRequest
84 голосов
/ 10 ноября 2010

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

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

Вот мой код:

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

Ответы [ 35 ]

173 голосов
/ 10 ноября 2010

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

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).
Итак, мы затем сравним н. Они равны, поэтому мы увеличиваем i1 (теперь 2) и уменьшаем i2 (теперь 2).
Теперь i1 и i2 равны (они оба равны 2), поэтому условие цикла while больше не выполняется, поэтому цикл завершается, и мы возвращаем true.

112 голосов
/ 10 ноября 2010

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

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 предоставил очень тщательный анализ эффективности (или ее отсутствия) этого решения, как с точки зрения времени и пространства. Если вы заинтересованы в вычислительной сложности этого и других возможных решений этого вопроса, пожалуйста, прочтите его!

58 голосов
/ 22 февраля 2013

Краткая версия, которая не включает (неэффективно) инициализацию группы объектов:

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;    
}
16 голосов
/ 30 октября 2016

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

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

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));
}
9 голосов
/ 04 марта 2014

Go, Java:

public boolean isPalindrome (String word) {
    String myWord = word.replaceAll("\\s+","");
    String reverse = new StringBuffer(myWord).reverse().toString();
    return reverse.equalsIgnoreCase(myWord);
}

isPalindrome("Never Odd or Even"); // True
isPalindrome("Never Odd or Even1"); // False
4 голосов
/ 10 ноября 2010
public class Palindromes {
    public static void main(String[] args) {
         String word = "reliefpfpfeiller";
         char[] warray = word.toCharArray(); 
         System.out.println(isPalindrome(warray));       
    }

    public static boolean isPalindrome(char[] word){
        if(word.length%2 == 0){
            for(int i = 0; i < word.length/2-1; i++){
                if(word[i] != word[word.length-i-1]){
                    return false;
                }
            }
        }else{
            for(int i = 0; i < (word.length-1)/2-1; i++){
                if(word[i] != word[word.length-i-1]){
                    return false;
                }
            }
        }
        return true;
    }
}
4 голосов
/ 02 мая 2017

А вот полное Java 8 потоковое решение. IntStream предоставляет все индексы до половины длины строки, а затем выполняется сравнение с начала и с конца.

public static void main(String[] args) {
    for (String testStr : Arrays.asList("testset", "none", "andna", "haah", "habh", "haaah")) {
        System.out.println("testing " + testStr + " is palindrome=" + isPalindrome(testStr));
    }
}

public static boolean isPalindrome(String str) {
    return IntStream.range(0, str.length() / 2)
            .noneMatch(i -> str.charAt(i) != str.charAt(str.length() - i - 1));
}

Вывод:

testing testset is palindrome=true
testing none is palindrome=false
testing andna is palindrome=true
testing haah is palindrome=true
testing habh is palindrome=false
testing haaah is palindrome=true
4 голосов
/ 26 мая 2016

также другое решение:

public static boolean isPalindrome(String s) {

        for (int i=0 , j=s.length()-1 ; i<j ; i++ , j-- ) {

            if ( s.charAt(i) != s.charAt(j) ) {
                return false;
            }
        }

        return true;
    }
3 голосов
/ 02 июня 2017

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

public int isPalindrome(String a) {
        //Remove all spaces and non alpha characters
        String ab = a.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
        //System.out.println(ab);

        for (int i=0; i<ab.length()/2; i++) {
            if(ab.charAt(i) != ab.charAt((ab.length()-1)-i)) {
                return 0;
            }
        }   
        return 1;
    }
3 голосов
/ 08 февраля 2013
public class palindrome {
public static void main(String[] args) {
    StringBuffer strBuf1 = new StringBuffer("malayalam");
    StringBuffer strBuf2 = new StringBuffer("malayalam");
    strBuf2.reverse();


    System.out.println(strBuf2);
    System.out.println((strBuf1.toString()).equals(strBuf2.toString()));
    if ((strBuf1.toString()).equals(strBuf2.toString()))
        System.out.println("palindrome");
    else
        System.out.println("not a palindrome");
}

}

...