
本文详解如何在java中实现最长回文子串的查找,重点修复原始代码中因空格初始化和错误排序逻辑导致的运行异常,并提供可直接运行的优化版本。
本文详解如何在java中实现最长回文子串的查找,重点修复原始代码中因空格初始化和错误排序逻辑导致的运行异常,并提供可直接运行的优化版本。
在解决“从给定字符串中找出最长回文子串”这一经典问题时,核心在于穷举所有可能子串 + 高效验证回文 + 正确选取最长者。原始实现虽思路清晰(暴力枚举+回文判断+排序取最大),但存在两处关键缺陷,导致结果错误甚至无限循环:
? 关键问题剖析
空字符串误初始化为
" "(含空格)
在isPalindrome()和主循环中,sum = " "初始化引入了前置空格,使"it"变成" it",导致equalsIgnoreCase()比较永远失败。✅ 正确做法是使用空字符串""。手动排序逻辑严重错误
原代码试图用选择排序重排ArrayList,却错误地使用list.add(i, ...)和list.add(minIndex, ...)—— 这不是交换元素,而是在指定位置插入新元素,导致列表长度指数级增长、索引越界或死循环。✅ 应使用Collections.sort()配合自定义比较器,或直接遍历一次找最长。
✅ 优化后的完整解决方案
以下代码已修复全部问题,时间复杂度为 O(n³)(适用于中等长度输入),逻辑清晰、健壮可运行:
import java.util.*;
class Solution {
// 判断字符串是否为回文(忽略大小写)
public static boolean isPalindrome(String check) {
if (check == null || check.isEmpty()) return true;
String reversed = new StringBuilder(check).reverse().toString();
return check.equalsIgnoreCase(reversed);
}
// 查找最长回文子串
public static String longestPalindrome(String s) {
if (s == null || s.length() palindromes = new ArrayList();
// 枚举所有子串 [i, j](闭区间)
for (int i = 0; i Integer.compare(b.length(), a.length()));
return palindromes.get(0);
}
// 测试入口
public static void main(String[] args) {
System.out.println(longestPalindrome("Polagerregale")); // 输出: "lagerregal"
System.out.println(longestPalindrome("abccbaxyz")); // 输出: "abccba"
System.out.println(longestPalindrome("abc")); // 输出: "a"(单字符也是回文)
}
}
⚠️ 注意事项与进阶建议
- 性能提示:上述解法为暴力法,适合学习理解;实际项目中推荐使用 Manacher 算法(O(n)) 或 中心扩展法(O(n²)) 提升效率。
-
边界处理:已补充
null和空字符串校验,避免运行时异常。 -
回文判定优化:使用
StringBuilder.reverse()替代手动拼接,更简洁且不易出错。 -
返回值约定:当无回文时返回
""(空字符串)比null更符合 Java 字符串操作惯例,避免调用方空指针风险。
掌握此实现后,你不仅能正确输出 "lagerregal" 这类经典回文,更能深入理解字符串处理、集合操作与算法调试的关键细节。










