4

文字列が回文である場合にtrueを返すJavaメソッドを記述したいと思います。

これが私がこれまでに持っているものです:

String palindrome = "...";
boolean isPalindrome = palindrome.equals(
   new StringBuilder(palindrome).reverse().toString());

これに関する私の問題は、次のような単語がRace carパリンドロームであると見なされないことです。

Doc, note, I dissent. A fast never prevents a fatness. I diet on cod.

大文字と小文字を区別せず、句読点を無視して、これが回文であるかどうかをテストするための最良の方法は何ですか。

4

5 に答える 5

7

この正規表現を使用して、すべての句読点とスペースを削除し、小文字に変換します

String palindrome = "..." // from elsewhere
boolean isPalindrome = palindrome.replaceAll("[^A-Za-z]", "").toLowerCase().equals(new StringBuilder(palindrome.replaceAll("[^A-Za-z]", "").toLowerCase()).reverse().toString());
于 2013-03-14T05:17:43.913 に答える
1

これを試して ..

public static void main(String[] args) {

    boolean notPalindrome = false;
    String string = "Doc, note, I dissent. A fast never prevents a fatness. I diet on cod";

    string = string.replaceAll("[^a-zA-Z]+","").toLowerCase();

    char[] array = string.toCharArray();
    for(int i=0, j=array.length-1; i<j; i++, j--) {
        if(array[i] != array[j]) {
            notPalindrome = true;
            break;
        }
    }
    System.out.println(string + " is palindrome? " + !notPalindrome);
}
于 2013-03-14T05:12:55.660 に答える
0

必要に応じて、以下の正規表現を使用してnumeric、パリンドローム内の文字を均等に保ちます。0-9それ以外の場合は、正規表現からを削除できます。

String palindrome = "..." // from elsewhere
String regex = "[^A-Za-z0-9]";
boolean isPalindrome = palindrome.equals(new StringBuilder(palindrome.replaceAll(regex, "").toLowerCase()).reverse().toString());
于 2013-03-14T05:21:37.290 に答える
0

これが非regex解決策です。

public class so4
{
public static void main(String args[])
{
    String str = "Doc, note, I dissent. A fast never prevents a fatness. I diet on cod";
    char c[] =str.toCharArray();
    String newStr="";
    for(int i=0;i<c.length;i++)
    {
        if( (c[i]>=65 && c[i]<=90) || (c[i]>=97 && c[i]<=122))  //check ASCII values (A-Z 65-90) and (a-z 97-122)
        {
            newStr = newStr + c[i]; 
        }
    }
    boolean isPalindrome = newStr.toLowerCase().equals(new StringBuilder(newStr.toLowerCase()).reverse().toString());
    System.out.println(isPalindrome);
}
}
于 2013-03-14T05:26:53.423 に答える
0
  1. 小文字に変換する

  2. 正規表現を使用して、文字以外のすべてを削除します

  3. StringBuilderを使用して文字列を反転します

  4. 文字列が等しいかどうかを比較します

コード:

/**
 *  Returns true if s is a palindrome, ignoring whitespace
 *  punctuation, and capitalization.  Returns false otherwise.  
 */

public boolean isPalindrome(String s) {
    String forward = s.toLowerCase().replaceAll("[^a-z]", "");
    String reverse = new StringBuilder(forward).reverse().toString();
    return forward.equals(reverse);
}

詳細については、StringおよびStringBuilderのドキュメントを参照してください。

「 Java7String 」をグーグルで検索し、最初の結果をクリックして見つけることもできます。

于 2013-03-14T06:03:37.567 に答える