Java,检查一个字符串是否是回文。不区分大小写。

4

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

以下是我目前的代码:

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

我的问题是这种做法并未将"Race car"视为回文。

它涉及到IT技术相关内容。
Doc, note, I dissent. A fast never prevents a fatness. I diet on cod.

如何最好地测试这是否为回文,不区分大小写和忽略标点。

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

感谢您抽出时间回复,但是: 输出: 赛车 假 - user2121604
1
@user2121604 - 他只是忘记将“回文”转换为小写... 你应该试着理解并从这个答案中学习,而不仅仅是复制粘贴。 - jahroy
我先试着看看它是否有效,然后再尝试从中学习。但是你能否详细说明一下?我不知道如何将所有内容转换为小写,我是Java的新手。对此感到抱歉,谢谢。 - user2121604
如果你只想匹配空格,可以使用\s代替匹配字母范围,但这取决于你希望匹配的具体细节。 - TimE

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

Vineet提供的解决方案似乎更为合适。 - Sudhanshu Umalkar
实际上,目前看起来这个方法是可行的,但在决定采用它之前,我会继续检查是否有其他不同的想法!感谢您花时间。 - user2121604

0
使用以下正则表达式,如果需要,在回文中保留偶数个数字字符。否则,您可以从正则表达式中删除0-9。
String palindrome = "..." // from elsewhere
String regex = "[^A-Za-z0-9]";
boolean isPalindrome = palindrome.equals(new StringBuilder(palindrome.replaceAll(regex, "").toLowerCase()).reverse().toString());

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

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"并点击第一个结果来找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接