代码越界问题排查:查找子串所有回文时出现越界
解决回文子串查找的越界问题
嘿,我完全懂你现在的困扰——好不容易把回文检测的核心逻辑搞通了,结果代码却卡在了越界问题上,总是没法在最后一个字符那里及时停下,对吧?这种边界问题确实容易踩坑,我帮你梳理几个最常见的原因和对应的修正方案:
一、循环边界设置错误
这是最常见的问题,尤其是在枚举所有可能的子串起始/结束索引时:
- 字符串的有效索引范围是从
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
相关产品推荐
相关产品推荐

