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

Python实现列表字符串最长公共前缀函数返回值异常求助

问题根因
  • 核心逻辑错误:最长公共前缀必须是所有字符串从索引0开始的连续共有字符序列,但原代码只要发现某位置字符和第一个字符串对应位置相等,就直接追加到结果中,完全不校验之前已经匹配的前缀是否和当前单词匹配,最终把不同单词的匹配字符堆叠成了flowfl这类无意义结果。
  • 你尝试的移除字符逻辑属于「先追加错误内容再补删」的思路,很容易触发索引越界、误删有效字符的问题,且完全没必要——连续匹配只要遇到第一个断点,后续字符一定不属于公共前缀,直接截断即可。
  • 末尾新增字符计数器的思路完全偏离需求,公共前缀只和位置连续匹配有关,和字符出现次数没有关联,属于冗余逻辑。
修复方案(保留原有for+while循环结构,无冗余代码)

不需要重构整体遍历框架,只需要调整结果更新逻辑即可:

  1. 初始公共前缀直接取列表第一个字符串,不需要从空字符串开始逐字符累加
  2. 每遍历一个后续单词,逐位对比当前公共前缀和该单词的字符,遇到第一个不相等的位置,直接把公共前缀截断到该位置之前,终止当前单词的对比
  3. 如果任意一步公共前缀变为空,直接返回空字符串,无需继续遍历后续内容

修复后的可运行代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:51:06