给定字符串最长回文子串Java实现异常:输出不符问题排查
最长回文子串实现问题修复
原代码核心问题
- 回文判断逻辑错误:
isPalindrome方法中sum初始值为带空格的" ",导致反转后的字符串自带前缀空格,永远无法与原串匹配,所有回文判断均失效。 - 子串遍历遗漏:外层循环
i < s.length()-1跳过了最后一个字符作为单个子串的场景,当字符串无长度≥2的回文时,本应返回单个字符,原代码却返回null,不符合题目要求。 - 选择排序实现错误:使用
list.add进行元素交换会导致列表元素数量翻倍,排序逻辑完全失效,正确做法是用list.set替换元素位置。 - 边界场景处理不当:输入长度为1的字符串或空串时,原代码返回
null,违反题目中单个字符为回文、空串返回空串的要求。
修正后的代码
class Solution { public boolean isPalindrome(String check) { // 用StringBuilder优化字符串拼接性能 StringBuilder reversed = new StringBuilder(); for (int i = check.length() - 1; i >= 0; i--) { reversed.append(check.charAt(i)); } // 严格匹配原串(若题目不区分大小写可改为equalsIgnoreCase) return reversed.toString().equals(check); } public String longestPalindrome(String s) { ArrayList<String> palindromes = new ArrayList<>(); // 遍历所有可能的子串,包含单个字符的情况 for (int i = 0; i < s.length(); i++) { for (int j = i; j < s.length(); j++) { String subStr = s.substring(i, j + 1); if (isPalindrome(subStr)) { palindromes.add(subStr); } } } // 选择排序:按子串长度从小到大排序 for (int i = 0; i < palindromes.size() - 1; i++) { int minLenIndex = i; for (int j = i + 1; j < palindromes.size(); j++) { if (palindromes.get(j).length() < palindromes.get(minLenIndex).length()) { minLenIndex = j; } } // 正确交换两个位置的元素 String temp = palindromes.get(i); palindromes.set(i, palindromes.get(minLenIndex)); palindromes.set(minLenIndex, temp); } // 处理空输入,返回空串而非null;否则返回最长的子串 return palindromes.isEmpty() ? "" : palindromes.get(palindromes.size() - 1); } }
优化说明
- 用
StringBuilder替代字符串拼接,避免频繁创建字符串对象,提升运行效率。 - 修正了回文判断的初始值错误,确保反转后的字符串与原串完全匹配。
- 补全了子串遍历的所有场景,包含单个字符的回文。
- 修复了选择排序的交换逻辑,确保排序正常工作。
- 完善了边界场景处理,符合题目对空串、单字符输入的要求。
内容的提问来源于stack exchange,提问作者kuljotSB
相关产品推荐
相关产品推荐

