Python实现列表字符串最长公共前缀函数返回值异常求助
问题根因
- 核心逻辑错误:最长公共前缀必须是所有字符串从索引0开始的连续共有字符序列,但原代码只要发现某位置字符和第一个字符串对应位置相等,就直接追加到结果中,完全不校验之前已经匹配的前缀是否和当前单词匹配,最终把不同单词的匹配字符堆叠成了
flowfl这类无意义结果。 - 你尝试的移除字符逻辑属于「先追加错误内容再补删」的思路,很容易触发索引越界、误删有效字符的问题,且完全没必要——连续匹配只要遇到第一个断点,后续字符一定不属于公共前缀,直接截断即可。
- 末尾新增字符计数器的思路完全偏离需求,公共前缀只和位置连续匹配有关,和字符出现次数没有关联,属于冗余逻辑。
修复方案(保留原有for+while循环结构,无冗余代码)
不需要重构整体遍历框架,只需要调整结果更新逻辑即可:
- 初始公共前缀直接取列表第一个字符串,不需要从空字符串开始逐字符累加
- 每遍历一个后续单词,逐位对比当前公共前缀和该单词的字符,遇到第一个不相等的位置,直接把公共前缀截断到该位置之前,终止当前单词的对比
- 如果任意一步公共前缀变为空,直接返回空字符串,无需继续遍历后续内容
修复后的可运行代码:
def lcp(strs): if not isinstance(strs, list) or len(strs) == 0: return "" if len(strs) == 1: return strs[0] # 初始化公共前缀为第一个字符串 prefix = strs[0] for word in strs[1:]: i = 0 # 逐位查找连续匹配的长度 while i < len(prefix) and i < len(word) and prefix[i] == word[i]: i += 1 # 截断到第一个不匹配的位置 prefix = prefix[:i] # 前缀为空直接返回,无需后续遍历 if not prefix: return "" return prefix # 测试用例 print(lcp(["flower","flow","flight"])) # 输出 fl,和你预期的结果一致 print(lcp(["flower","flow","flight", "dog"])) # 输出 "",因dog和其余单词首字母不匹配,无公共前缀 print(lcp(["dog","car"])) # 输出 "" print(lcp(["dog","racecar","car"])) # 输出 "" print(lcp([])) # 输出 "" print(lcp(["one"])) # 输出 "one"
逻辑说明
- 完全沿用你原本的双层循环结构,没有新增临时副本、计数器之类的多余变量
- 匹配过程中不会追加无效字符,从根源上避免了后续删除字符的麻烦,时间复杂度、空间复杂度均为最优
- 覆盖了空列表、单元素列表、无公共前缀等所有边界场景
内容的提问来源于stack exchange,提问作者dimButTries
相关产品推荐
相关产品推荐

