【问题标题】:Java, Check if a String is a palindrome. Case insensitiveJava,检查字符串是否是回文。不区分大小写
【发布时间】:2013-03-14 05:09:22
【问题描述】:

如果字符串是回文,我想编写一个 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.

测试这是否是回文的最佳方法是不区分大小写并忽略标点符号。

【问题讨论】:

    标签: java string compare


    【解决方案1】:

    使用此正则表达式删除所有标点符号和空格并将其转换为小写

    String palindrome = "..." // from elsewhere
    boolean isPalindrome = palindrome.replaceAll("[^A-Za-z]", "").toLowerCase().equals(new StringBuilder(palindrome.replaceAll("[^A-Za-z]", "").toLowerCase()).reverse().toString());
    

    【讨论】:

    • 感谢您抽出宝贵时间回复,但是:输出:Race car false
    • @user2121604 - 他只是忘记将 palindrome 转换为小写...您应该尝试从这个答案中理解和学习,而不是仅仅复制和粘贴它。
    • 嗯,我想先看看它是否有效,然后尝试从中学习。但是你能详细说明一下吗?我不知道如何将其全部转换为小写,我是 Java 新手。抱歉,谢谢
    • 如果您只想匹配空格,您可以使用 \s 而不是匹配字母范围,但这取决于您希望匹配是否有效。
    【解决方案2】:

    试试这个..

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

    【讨论】:

    • Soln by Vineet 似乎更合适。
    • 实际上这似乎工作到目前为止,我会继续检查是否有其他人有不同的想法,但在决定去之前!感谢您抽出宝贵时间
    【解决方案3】:

    如果需要,使用下面的正则表达式在回文中保留 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());
    

    【讨论】:

      【解决方案4】:

      这是一个非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);
      }
      }
      

      【讨论】:

        【解决方案5】:
        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”并单击第一个结果来找到它。

        【讨论】:

          猜你喜欢
          • 2014-09-02
          • 2015-09-28
          • 2015-01-17
          • 1970-01-01
          • 2010-11-27
          • 2011-03-27
          • 2015-02-08
          • 1970-01-01
          相关资源
          最近更新 更多