C#实现LeetCode最长公共前缀抛出IndexOutOfRangeException如何解决
异常触发原因
- 直接原因:你只以第一个字符串
strs[0]的长度作为循环边界,没有校验其他待比对字符串的长度,当其他字符串比strs[0]短的时候,访问超出其长度的索引就会抛出IndexOutOfRangeException。以输入["ab","a"]为例,strs[0]长度为2,循环会执行到i=1,此时尝试访问strs[1][1],但strs[1]的长度只有1,合法索引范围仅为0,直接触发越界。 - 潜在逻辑错误:你的比对逻辑本身不符合最长公共前缀的规则。最长公共前缀要求所有字符串的相同位置字符全部相等,但你的代码每匹配一个字符就将
h后移一位,下一轮循环比对的是下一个字符串的同位置字符,完全跳过了前面字符串后续位置的校验,第一个测试用例能输出正确结果纯属巧合。
修复方案
调整遍历逻辑:外层循环遍历字符索引,内层循环遍历所有字符串,每一位索引都要校验所有字符串的同位置字符是否合法且相等,只要有一个不满足就直接返回前缀结果,修复后的代码如下:
public class Solution { public string LongestCommonPrefix(string[] strs) { if (strs == null || strs.Length == 0) return ""; if (strs.Length == 1) return strs[0]; // 以第一个字符串为基准遍历每一位字符 for (int i = 0; i < strs[0].Length; i++) { char current = strs[0][i]; // 校验其他所有字符串的同位置字符 for (int j = 1; j < strs.Length; j++) { // 其他字符串长度不足,或字符不相等,直接返回前i位前缀 if (i >= strs[j].Length || strs[j][i] != current) { return strs[0].Substring(0, i); } } } // 第一个字符串的所有字符都匹配,直接返回即可 return strs[0]; } }
修复后的代码做了核心调整:
- 访问任意字符串的索引前先判断索引是否小于该字符串的长度,从根源避免索引越界
- 修正了比对逻辑,每一位字符都会和所有字符串的同位置字符做校验,确保前缀是所有字符串共有的
- 直接用
Substring截取结果,无需额外计数和StringBuilder拼接,逻辑更简洁
内容的提问来源于stack exchange,提问作者Blake
相关产品推荐
相关产品推荐

