
本文详解java中暴力法求解最长回文子串的实现要点,重点修复空格初始化错误、无限扩容导致的死循环,并优化排序逻辑,最终给出简洁可靠的解决方案。
本文详解java中暴力法求解最长回文子串的实现要点,重点修复空格初始化错误、无限扩容导致的死循环,并优化排序逻辑,最终给出简洁可靠的解决方案。
在字符串处理算法中,“最长回文子串”是一个经典问题:给定一个字符串,需找出其中长度最大且正读反读均一致的连续子串(如 "lagerregal" 是 "Polagerregale" 中的最长回文)。虽然存在时间复杂度为 O(n) 的 Manacher 算法,但初学者常采用直观的暴力枚举法——即穷举所有子串并逐一验证回文性。本文基于该思路,系统梳理实现细节与常见陷阱,并提供健壮可运行的 Java 解决方案。
? 核心问题诊断与修复
原始代码存在两个关键缺陷:
错误的初始字符串赋值
String sum = " ";创建的是含一个空格的非空字符串,后续通过sum + check.charAt(i)拼接时,会始终在结果前多出一个空格(如"it"变成" it"),导致equalsIgnoreCase()比较必然失败。✅ 修正为String sum = "";—— 使用真正空字符串。-
错误的手动排序逻辑引发无限循环
原代码用选择排序思想遍历list,却在循环体内执行:list.add(i, list.get(minIndex)); // 插入元素 → list.size() 增加 list.add(minIndex, temp); // 再次插入 → list.size() 再增
这导致
list.size()在循环中持续增长,i 条件永远为真,程序陷入死循环。✅ 正确做法是调用 <code>Collections.sort()配合自定义比较器,按长度升序排序。
✅ 优化后的完整实现
import java.util.*;
class Solution {
// 判断字符串是否为回文(忽略大小写)
public static boolean isPalindrome(String check) {
if (check == null || check.length() == 0) return true;
String reversed = new StringBuilder(check).reverse().toString();
return check.equalsIgnoreCase(reversed);
}
// 返回字符串中最长回文子串;若无回文,返回 null
public static String longestPalindrome(String s) {
if (s == null || s.length() palindromes = new ArrayList();
// 枚举所有子串 [i, j](闭区间)
for (int i = 0; i <h3>⚠️ 注意事项与进阶建议</h3>
- 时间复杂度:本解法为 O(n³) —— O(n²) 子串数 × O(n) 回文判断。对长字符串(>1000 字符)性能较差,生产环境推荐使用中心扩展法(O(n²))或 Manacher 算法(O(n))。
-
边界处理:已增强
null和短字符串校验,避免空指针与越界异常。 -
回文判定优化:使用
StringBuilder.reverse()替代手动拼接,更简洁高效;也可双指针法进一步降低空间开销。 -
唯一性说明:当存在多个等长最长回文时,本实现返回最后找到的一个(因按字典序或插入顺序,
sort()不保证稳定性;如需确定性结果,可添加二级排序逻辑)。
掌握此暴力法的正确实现,是理解回文算法演进的重要基石。在确保逻辑正确的前提下,再逐步向更优解法迁移,方为扎实的算法学习路径。










