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

代码越界问题排查:查找子串所有回文时出现越界

解决回文子串查找的越界问题

嘿,我完全懂你现在的困扰——好不容易把回文检测的核心逻辑搞通了,结果代码却卡在了越界问题上,总是没法在最后一个字符那里及时停下,对吧?这种边界问题确实容易踩坑,我帮你梳理几个最常见的原因和对应的修正方案:

一、循环边界设置错误

这是最常见的问题,尤其是在枚举所有可能的子串起始/结束索引时:

  • 字符串的有效索引范围是从0到length()-1,如果你的结束索引写到了<= s.length(),直接用charAt(j)的时候就会触发越界;
  • 就算是用左闭右开的substring(i,j),虽然j可以等于length(),但这时候得到的是空串,完全没必要处理,所以可以把j的起始设为i+1,避免无效的空串检查。

举个错误到修正的例子:

// ❌ 错误代码:j的范围到length,若直接操作j会触发越界
for (int i = 0; i < s.length(); i++) {
    for (int j = i; j <= s.length(); j++) {
        String sub = s.substring(i, j);
        if (isPalindrome(sub)) {
            // 记录回文
        }
    }
}

// ✅ 修正后:j从i+1开始,避免空串,同时确保访问字符时索引合法
for (int i = 0; i < s.length(); i++) {
    for (int j = i + 1; j <= s.length(); j++) {
        String sub = s.substring(i, j);
        if (isPalindrome(sub)) {
            result.add(sub);
        }
    }
}

二、中心扩展法的边界判断滞后

如果用的是效率更高的中心扩展法,很容易犯“先移动指针再检查边界”的错误:比如你先把left--、right++,再判断是否越界,这时候指针已经跑到字符串外面去了,自然会触发越界异常。

修正思路:先判断边界和字符是否相等,再执行指针移动和回文记录:

// ❌ 错误的扩展逻辑:先移动再判断,导致越界
while (s.charAt(left) == s.charAt(right)) {
    // 记录回文
    left--;
    right++;
}

// ✅ 正确的扩展逻辑:先检查边界和字符匹配,再操作
while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
    // 先记录当前合法的回文子串
    result.add(s.substring(left, right + 1));
    // 再向两边扩展
    left--;
    right++;
}

三、回文检测方法内部的边界错误

别忘了检查你的isPalindrome方法本身有没有越界问题!比如初始化右指针的时候写成了right = s.length()而不是right = s.length()-1:

// ❌ 错误的回文检测:right初始值越界
public boolean isPalindrome(String s) {
    int left = 0;
    int right = s.length(); // 应该是s.length()-1
    while (left < right) {
        if (s.charAt(left) != s.charAt(right)) return false;
        left++;
        right--;
    }
    return true;
}

// ✅ 修正后:右指针从最后一个有效索引开始
public boolean isPalindrome(String s) {
    int left = 0;
    int right = s.length() - 1;
    while (left < right) {
        if (s.charAt(left) != s.charAt(right)) return false;
        left++;
        right--;
    }
    return true;
}

总结一下

核心原则就是:所有访问字符串字符的操作,索引必须严格落在[0, s.length()-1]这个区间内。写循环或扩展逻辑时,养成“先判断边界合法性,再执行操作”的习惯,就能避免大部分越界问题啦。

内容的提问来源于stack exchange,提问作者Atekoja zayyad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:16:37