[java] パリンドロームのチェック文字列



Answers

文字列がそれ自身の逆と比較することで、文字列が回文かどうかを調べることができます:

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

1.5より前のJavaのバージョンでは、

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

EDIT: @ FernandoPelliccioniは時間と空間の両方で、このソリューションの効率(またはその欠如)を非常に徹底的に分析しました。 この疑問に対するこの他の解決策の計算上の複雑さに興味があれば、それをお読みください!

Question

palindromepalindromeとは、単語、フレーズ、ナンバー、またはいずれかの方向に同じ方法で読むことができる他の単位の並びです。

単語がパリンドロムかどうかをチェックするには、単語のchar配列を取得し、文字を比較します。 私はそれをテストし、それは動作するようです。 しかし、私はそれが正しいかどうか、あるいは改善すべきことがあるかどうかを知りたい。

ここに私のコードです:

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



このような単純な問題に対するいくつかの異なるソリューションがどれほど存在するのか驚くべきことです! 別のものがあります。

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



最近、私はStringBuilderを使用しないpalindromeプログラムを書いた。 遅刻ですが、これは一部の人にとって便利なことがあります。

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



単語の文字を考慮しない

public static boolean palindromeWords(String s ){

        int left=0;
        int right=s.length()-1;

        while(left<=right){

            while(left<right && !Character.isLetter(s.charAt(left))){
                left++;
            }
            while(right>0 && !Character.isLetter(s.charAt(right))){
                right--;
            }

            if((s.charAt(left++))!=(s.charAt(right--))){
                return false;
            }
        }
        return true;
    }

---

@Test
public void testPalindromeWords(){
    assertTrue(StringExercise.palindromeWords("ece"));
    assertTrue(StringExercise.palindromeWords("kavak"));
    assertFalse(StringExercise.palindromeWords("kavakdf"));
    assertTrue(StringExercise.palindromeWords("akka"));
    assertTrue(StringExercise.palindromeWords("??e@@c_--e"));
}



また別の解決策:

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



私は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. 文字列が文字でない場合や文字が1文字の場合、それは回文文字列です。
  2. それ以外の場合は、文字列の最初と最後の文字を比較します。
    • 最初と最後の文字が異なる場合、文字列は回文ではありません
    • それ以外の場合、最初と最後の文字は同じです。 文字列からそれらを取り除き、残っている文字列が回文かどうかを判断します。 この小さな文字列の答えを取り出し、それを元の文字列の答えとして使用し、 1から繰り返します。



IMO、再帰的な方法は最も単純で明瞭です。

public static boolean isPal(String s)
{   
    if(s.length() == 0 || s.length() == 1)
        return true; 
    if(s.charAt(0) == s.charAt(s.length()-1))
       return isPal(s.substring(1, s.length()-1));                
   return false;
}



コードスニペット:

import java.util.Scanner;

 class main
 {
    public static void main(String []args)
    {
       Scanner sc = new Scanner(System.in);
       String str = sc.next();
       String reverse = new StringBuffer(str).reverse().toString();

        if(str.equals(reverse))
            System.out.println("Pallindrome");
        else
            System.out.println("Not Pallindrome");
     }
}



別の方法は、char配列を使用することです

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

}




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

}



私はこの問題の重複としてマークされた質問の解決に取り組みました。 ここにそれを投げるかもしれない...

問題はこれを解決するために1行を要求しました。文章の回文としてそれを多く取りました。スペースや句読点、大文字/小文字は結果を捨てることができます。

小さなテストクラスを使った醜い解決策があります:

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

それは一種の厄介なことを申し訳ありません - しかし、他の質問は、1つのライナーを指定しました。




あるいは、 再帰

与えられた文字列が回文として満足するかどうかを確認するために、より短い再帰的解を探している人は、

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;
    else return s.charAt(0) != s.charAt(length - 1) ? false :
            isPalindrome(s.substring(1, length - 1));
}



private static boolean isPalindrome(String word) {

        int z = word.length();
        boolean isPalindrome = false;

        for (int i = 0; i <= word.length() / 2; i++) {
            if (word.charAt(i) == word.charAt(--z)) {
                isPalindrome = true;
            }
        }

        return isPalindrome;
    }



Forループにはsub.length() / 2 - 1が含まれます。 文字列の中央の要素はチェックする必要がないため、1から減算する必要があります。

たとえば、7文字(1234567)、7/2 => 3の文字列をチェックしてから1をサブトラックする必要がある場合、文字列の位置は(0123456)になります。 でチェックされた文字はそれぞれ0、1、2の要素で6,5,4となります。 文字列の真ん中にあるので、位置3の要素は気にしません。

 private boolean isPalindromic(String sub) {
        for (int i = 0; i <= sub.length() / 2 - 1; i++) {
            if (sub.charAt(i) != sub.charAt(sub.length() - 1 - i)) {
                return false;
            }
        }
        return true;
    }



そしてここでは完全な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



Links