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
相关产品推荐
相关产品推荐

