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

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

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

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

W用于任何非字母数字。

通过s.replaceAll("\s+","");,您只是删除空格,但您还必须删除除字母数字字符(例如标点符号(以外的任何内容,在本例中为,.

相关内容

  • 没有找到相关文章

最新更新