Java中的字符串回文检查器不起作用?

时间:2019-01-11 20:51:31

标签: java string boolean stringbuilder palindrome

我正在尝试为这些说明编写程序:

  

给出一个字符串,确定它是否是回文,只考虑字母数字字符并忽略大小写。   注意:针对此问题,我们将空String定义为有效回文。   https://leetcode.com/problems/valid-palindrome/

由于某种原因,最后一行中的.reverse()不会将其反转。我已经尝试通过添加打印语句进行调试,并且发现字符串确实在更早的时候反转了。这里发生了什么?请指导我!

public static boolean isPalindrome(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if (Character.isLetter(s.charAt(i))) {
            sb.append(s.charAt(i));
        }
    }
    String x = sb.reverse().toString();
    System.out.println(x);
    if (sb.length() == 0) 
        return true;
    else 
        return sb.toString().equals(x);
}

2 个答案:

答案 0 :(得分:2)

问题是reverse()更改了StringBuilder本身。因此,您正在比较反向,再次与反向。而是将您的方法更改为:

String x = sb.toString();
return sb.reverse().toString().equals(x);

将反转前的StringBuilder和反转后的StringBuilder进行比较。请注意,if(sb.length == 0)不是必需的,好像它为空,sb.reverse().toString().equals(x)仍将返回true。

当问题陈述指出无论大小写均应匹配时,搜索也区分大小写。更改附加位置:

if (Character.isLetter(s.charAt(i))) {               
     sb.append(Character.toLowerCase(s.charAt(i)));
}

您还可以利用replaceAlltoLowerCase()将方法缩短为:

public static boolean pali(String s) {
    String copy = s.toLowerCase().replaceAll("[^a-z]", "");
    return new StringBuilder(copy).reverse().toString().equals(copy);       
}

答案 1 :(得分:0)

因为在第一次调用sb.reverse() sb之后更改了它的状态。