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

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];
    }
}

修复后的代码做了核心调整:

  1. 访问任意字符串的索引前先判断索引是否小于该字符串的长度,从根源避免索引越界
  2. 修正了比对逻辑,每一位字符都会和所有字符串的同位置字符做校验,确保前缀是所有字符串共有的
  3. 直接用Substring截取结果,无需额外计数和StringBuilder拼接,逻辑更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:54:03