如何解决最长公共前缀Python代码中的‘list index out of range’错误
解决最长公共前缀问题中的索引越界错误及逻辑优化
看起来你在实现最长公共前缀函数时遇到了索引越界的问题,咱们先拆解下问题根源,再给出更简洁可靠的实现方案。
错误原因分析
你提到的List index out of range错误,实际是出现在代码的第6行a2=strs[1](可能你数错了行号)。虽然你已经处理了数组为空的情况,但没考虑数组长度为1的场景:当输入只有一个字符串时,strs[1]根本不存在,直接访问就会触发索引越界。
除此之外,你的代码逻辑还有几个可以优化的地方:
- 分支处理太繁琐(分了长度为2和大于2的情况),其实可以用统一逻辑搞定
- 循环里的
i=0赋值会覆盖循环变量,导致无法正常遍历(比如for i in range(xmin):里又写i=0,循环会一直卡在i=0的位置) - 部分场景下没返回完整的公共前缀(比如所有字符串完全相同的情况)
优化后的实现方案
咱们可以采用横向扫描的思路:以第一个字符串为基准,依次和数组里的每个字符串对比,逐步缩短公共前缀的长度,直到找到所有字符串的公共前缀。
from typing import List class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: # 处理空数组的情况 if not strs: return "" # 拿第一个字符串当初始公共前缀 prefix = strs[0] # 遍历数组里剩下的每个字符串 for s in strs[1:]: # 取当前前缀和字符串的较短长度,避免索引越界 min_len = min(len(prefix), len(s)) prefix_len = 0 # 逐个字符对比,找到公共前缀的长度 while prefix_len < min_len and prefix[prefix_len] == s[prefix_len]: prefix_len += 1 # 更新公共前缀 prefix = prefix[:prefix_len] # 如果公共前缀为空,直接跳出循环返回,不用再对比了 if not prefix: break return prefix
代码说明
- 边界处理:先判断数组是否为空,直接返回空字符串
- 初始基准:用第一个字符串作为初始的公共前缀
- 逐个对比:遍历数组中剩下的每个字符串,和当前公共前缀对比,找到两者的公共前缀长度后更新prefix
- 提前终止:如果中途公共前缀变为空,直接跳出循环返回,避免不必要的计算
测试用例验证
- 示例1:输入
["flower","flow","flight"],初始prefix是"flower",和"flow"对比后prefix变为"flow",再和"flight"对比后变为"fl",最终返回"fl" - 示例2:输入
["dog","racecar","car"],第一个对比"dog"和"racecar"时公共前缀为空,直接返回"" - 特殊场景:输入
["a"],直接返回"a";输入["ab", "a"],返回"a"
这样的实现逻辑更简洁,也覆盖了所有边界情况,不会再出现索引越界的问题。
内容的提问来源于stack exchange,提问作者lin_s
相关产品推荐
相关产品推荐

