Java报String index out of range错误,最长重复子串代码问题排查
问题排查
- 数组越界问题:while循环判断
stA.charAt(p1+1)==stA.charAt(p2+1)前,没有校验p1+1和p2+1是否小于字符串长度,当p1或p2已经指向字符串最后一个字符时,访问+1的下标就会触发String index out of range异常。 - 字符串初始化错误:
stB初始值为null,使用+=拼接字符时会先把null转为字符串"null"拼在最前面,导致最终输出结果前缀异常,和预期不符。 - 逻辑提前终止错误:找到第一组匹配的连续子串后直接将i、j设为字符串长度终止循环,没有遍历所有可能的子串,无法保证得到的是最长子串。
- 计数逻辑错误:count变量没有和历史最长长度做对比更新,也没有在每次找到新的匹配子串时重置,计数结果不符合实际子串长度。
- 循环边界错误:两层for循环的终止条件为
i<stA.length()-1、j<stA.length()-1,会漏掉字符串最后一个位置的字符匹配场景。 - 子串重置逻辑缺失:每次匹配新的子串时没有清空stB的历史内容,会将多次匹配的字符拼接在一起,结果错误。
修复后参考代码
package as; import java.util.Scanner; public class askisii { public static void main(String[] args) { Scanner scan=new Scanner(System.in); String stA; // 初始化最长子串为空,初始最长长度为0 String longestSub = ""; int maxLen = 0; int i,j,p1,p2; System.out.println("Give a string:"); stA=scan.nextLine(); int len = stA.length(); for(i=0;i<len;i++) { for(j=i+1;j<len;j++) { p1 = i; p2 = j; int currentLen = 0; StringBuilder currentSub = new StringBuilder(); // 先判断下标不越界,再比较字符 while(p1 < len && p2 < len && stA.charAt(p1) == stA.charAt(p2)) { currentSub.append(stA.charAt(p1)); currentLen++; p1++; p2++; } // 只有当前子串长度大于历史最长时才更新,子串长度至少为2才符合重复出现要求 if(currentLen > maxLen && currentLen >=2) { maxLen = currentLen; longestSub = currentSub.toString(); } } } System.out.println("Longest substring:" + longestSub); System.out.println("Longest substring size:" + maxLen); scan.close(); } }
内容的提问来源于stack exchange,提问作者jonathan
相关产品推荐
相关产品推荐

