4

如果字符串是回文,我想编写一个 java 方法来返回 true。

这是我到目前为止所拥有的:

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

有关详细信息,请参阅StringStringBuilder的文档:

您也可以通过谷歌搜索“ Java 7 String ”并单击第一个结果来找到它。

于 2013-03-14T06:03:37.567 回答
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 回答