有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Leetcode有效回文问题调试

我很难理解我的代码在这个Leetcode问题上出了什么问题

问题:给定一个字符串,确定它是否是回文,只考虑字母数字字符,忽略大小写

现在,我通过了108/476个案例,我没有通过这个测试:“一个人,一个计划,一条运河:巴拿马”

这是我的代码,请帮我找出问题所在

class Solution {
public boolean isPalindrome(String s) {

    if (s.isEmpty()) return true;

    s.replaceAll("\\s+","");

    int i = 0;
    int j = s.length() - 1;

    while (i <= j) {

        if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) {

            return false;

        }

        i++;
        j--;

    }

    return true;

}
}

共 (3) 个答案

  1. # 1 楼答案

    你的replaceAll方法不正确

    你的replaceAll方法目前只删除空格。它应该删除所有特殊字符,只保留字母。如果我们像你一样使用正则表达式,这是最好的正则表达式之一:

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

    您可能会尝试使用\W(或[^\w]),但最新的正则表达式匹配[a-zA-Z0-9_],包括数字和下划线字符。这就是你想要的吗?然后用\W代替。如果没有,请坚持[^a-zA-Z]

    如果要匹配所有字母,无论是哪种语言,请使用以下命令:

    s = s.replace("\\P{L}", "");
    

    请注意,您可以像这样大幅缩短代码,尽管它肯定不是最快的:

    class Solution {
      public boolean isPalindrome(String s) {
        s = s.replaceAll("\\P{L}", "");
        return new StringBuilder(s).reverse().toString().equalsIgnoreCase(s);
      }
    }
    
  2. # 2 楼答案

    你的正则表达式无效。试试这个:

    s = s.replaceAll("[\\W]+", "");
    

    \W用于任何非字母数字的内容

  3. # 3 楼答案

    通过s.replaceAll("\\s+","");您不仅要删除空格,而且还必须删除除标点符号等字母数字字符以外的任何字符,在本例中,