You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode125:验证回文串中StringBuilder equals()方法不符合预期

解决LeetCode 125. Valid Palindrome中StringBuilder equals方法的问题

你的代码针对测试用例:

A man, a plan, a canal: Panama

返回false的核心原因是StringBuilder的equals()方法没有重写,它沿用了Object类的实现——只比较两个对象的引用是否相同,而不是比较内容是否一致。即使s2反转后内容和s1完全一样,它们也是两个不同的StringBuilder实例,因此equals()会返回false。

解决方案

把StringBuilder转换成String后再调用equals(),因为String类重写了equals(),会逐字符比较内容。

修改后的代码示例:

class Solution {
    public boolean isPalindrome(String s) {
        StringBuilder s1 = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char curr = s.charAt(i);
            // 用Character工具方法替代手动ASCII判断,更简洁
            if (Character.isLetterOrDigit(curr)) {
                curr = Character.toLowerCase(curr);
                s1.append(curr);
            }
        }
        // 反转s1得到s2,转成String后比较内容
        StringBuilder s2 = new StringBuilder(s1).reverse();
        return s2.toString().equals(s1.toString());
    }
}

更简洁的写法

你也可以直接反转处理后的字符串,省去额外的StringBuilder变量:

class Solution {
    public boolean isPalindrome(String s) {
        StringBuilder processed = new StringBuilder();
        for (char c : s.toCharArray()) {
            if (Character.isLetterOrDigit(c)) {
                processed.append(Character.toLowerCase(c));
            }
        }
        String original = processed.toString();
        String reversed = processed.reverse().toString();
        return original.equals(reversed);
    }
}

补充说明

手动判断ASCII码的写法虽然可行,但Character.isLetterOrDigit()方法已经封装了字母和数字的判断逻辑,代码可读性更强,也不容易出错(比如ASCII码范围写错)。

内容的提问来源于stack exchange,提问作者BALLA HARSHA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:26:22