Проверьте строку на палиндром - 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 ]

3 голосов
/ 03 июня 2011

Я работал над решением вопроса, который был помечен как дубликат этого. Можешь бросить его сюда ...

Вопрос требовал единственной строки, чтобы решить эту проблему, и я воспринял ее как литературный палиндром - чтобы пробел, пунктуация и верхний / нижний регистр могли отбрасывать результат.

Вот уродливое решение с небольшим тестовым классом:

public class Palindrome {
   public static boolean isPalendrome(String arg) {
         return arg.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(new StringBuilder(arg).reverse().toString().replaceAll("[^A-Za-z]", ""));
   }
   public static void main(String[] args) {
      System.out.println(isPalendrome("hiya"));
      System.out.println(isPalendrome("star buttons not tub rats"));
      System.out.println(isPalendrome("stab nail at ill Italian bats!"));
      return;
   }
}

Извините, что это противно, но другой вопрос указывает на одну строку.

2 голосов
/ 16 декабря 2014

Я новичок в Java, и я принимаю ваш вопрос как задачу улучшить свои знания.

import java.util.ArrayList;
import java.util.List;

public class PalindromeRecursiveBoolean {

    public static boolean isPalindrome(String str) {

        str = str.toUpperCase();
        char[] strChars = str.toCharArray();

        List<Character> word = new ArrayList<>();
        for (char c : strChars) {
            word.add(c);
        }

        while (true) {
            if ((word.size() == 1) || (word.size() == 0)) {
                return true;
            }
            if (word.get(0) == word.get(word.size() - 1)) {
                word.remove(0);
                word.remove(word.size() - 1);
            } else {
                return false;

            }

        }
    }
}
  1. Если строка состоит не из букв или только из одной буквы, это палиндром.
  2. В противном случае сравните первую и последнюю буквы строки.
    • Если первая и последняя буквы различаются, то строка не является палиндромом
    • В противном случае первая и последняя буквы совпадают. Уберите их из строки и определите, является ли оставшаяся строка палиндромом. Возьмите ответ для этой меньшей строки и используйте его как ответ для исходной строки, затем повторите с 1 .
1 голос
/ 24 июня 2015

Другой способ - использовать массив Array

.
public class Palindrome {

public static void main(String[] args) {
    String str = "madam";
    if(isPalindrome(str)) {
        System.out.println("Palindrome");
    } else {
        System.out.println("Not a Palindrome");
    }
}

private static boolean isPalindrome(String str) {
    // Convert String to char array
    char[] charArray = str.toCharArray();  
    for(int i=0; i < str.length(); i++) {
        if(charArray[i] != charArray[(str.length()-1) - i]) {
            return false;
        }
    }
    return true;
}

}

1 голос
/ 29 мая 2015
public boolean isPalindrome(String abc){
    if(abc != null && abc.length() > 0){
        char[] arr = abc.toCharArray();
        for (int i = 0; i < arr.length/2; i++) {
            if(arr[i] != arr[arr.length - 1 - i]){
                return false;
            }
        }
        return true;
    }
    return false;
}
1 голос
/ 12 марта 2013

Попробуйте это:

import java.util.*;
    public class str {

        public static void main(String args[])
        {
          Scanner in=new Scanner(System.in);
          System.out.println("ENTER YOUR STRING: ");
          String a=in.nextLine();
          System.out.println("GIVEN STRING IS: "+a);
          StringBuffer str=new StringBuffer(a);
          StringBuffer str2=new StringBuffer(str.reverse());
          String s2=new String(str2);
          System.out.println("THE REVERSED STRING IS: "+str2);
            if(a.equals(s2))    
                System.out.println("ITS A PALINDROME");
            else
                System.out.println("ITS NOT A PALINDROME");
            }
    }
1 голос
/ 02 декабря 2018
  • Эта реализация работает для чисел и строк.
  • Поскольку мы ничего не пишем, нет необходимости преобразовывать строку в массив символов.
public static boolean isPalindrome(Object obj)
{
    String s = String.valueOf(obj);

    for(int left=0, right=s.length()-1; left < right; left++,right--)
    {
        if(s.charAt(left++) != s.charAt(right--))
            return false;
    }
    return true;
}
1 голос
/ 14 ноября 2016

Вот мой анализ ответа @Greg: componentsprogramming.com / palindromes


Sidenote: Но для меня важно сделать это Универсальным способом . Требования состоят в том, чтобы последовательность была двунаправленной итерацией, а элементы последовательности сравнимы с использованием равенства. Я не знаю, как это сделать в Java, но вот версия на C ++, я не знаю лучшего способа сделать это для двунаправленных последовательностей.

template <BidirectionalIterator I> 
    requires( EqualityComparable< ValueType<I> > ) 
bool palindrome( I first, I last ) 
{ 
    I m = middle(first, last); 
    auto rfirst = boost::make_reverse_iterator(last); 
    return std::equal(first, m, rfirst); 
} 

Сложность: линейное время,

  • Если я - RandomAccessIterator: этаж (n / 2) сравнения и этаж (n / 2) * 2 итерации

  • Если я двунаправленный итератор: этаж (n / 2) сравнения и этаж (n / 2) * 2 итерации плюс (3/2) * n итераций для нахождения середины (средняя функция)

  • хранение: O (1)

  • Нет памяти с выделением памяти для двоеточия


1 голос
/ 18 января 2018

Удивительно, сколько существует разных решений такой простой проблемы! Вот еще один.

private static boolean palindrome(String s){
    String revS = "";
    String checkS = s.toLowerCase();
    String[] checkSArr = checkS.split("");

    for(String e : checkSArr){
        revS = e + revS;
    }

    return (checkS.equals(revS)) ? true : false;
}
1 голос
/ 20 апреля 2017

Недавно я написал программу для палиндрома, которая не использует StringBuilder.Поздний ответ, но это может пригодиться некоторым людям.

public boolean isPalindrome(String value) {
    boolean isPalindrome = true;
    for (int i = 0 , j = value.length() - 1 ; i < j ; i ++ , j --) {
        if (value.charAt(i) != value.charAt(j)) {
            isPalindrome = false;
        }
    }
    return isPalindrome;
}
1 голос
/ 26 мая 2017
 public static boolean isPalindrome(String word) {
    String str = "";
    for (int i=word.length()-1; i>=0;  i--){
        str = str + word.charAt(i);
    }
   if(str.equalsIgnoreCase(word)){
       return true;
   }else{
       return false;
   }

}
...