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

Python如何提取字符串列表所有元素的公共起始前缀?

最长公共前缀实现问题解答

原代码错误原因

你的实现思路存在核心逻辑缺陷:公共前缀要求相同位置的字符在所有字符串中完全一致,而你统计的是所有字符全局出现的总次数,没有绑定字符的位置信息,自然会输出不符合要求的结果。同时你使用Counter(alist)是对整个列表的字符串元素做频次统计,完全没有用到公共前缀的位置匹配特性,属于API误用。

修正方案1:调整原统计逻辑(用字典)

如果要保留统计的思路,需要按索引位置统计字符出现次数,只有当前位置某个字符的出现次数等于列表长度时,才属于公共前缀的字符,代码如下:

alist = ["flower","flow","flight"]
length = len(alist)
# 处理空列表边界情况
if length == 0:
    print("")
    exit()
# 取最短字符串的长度作为最大匹配上限,避免索引越界
max_match_len = min(len(s) for s in alist)
prefix = ""

for idx in range(max_match_len):
    count = {}
    # 统计当前索引位置的所有字符出现次数
    for s in alist:
        char = s[idx]
        count[char] = count.get(char, 0) + 1
    # 检查是否有字符在当前位置全量出现
    for char, cnt in count.items():
        if cnt == length:
            prefix += char
            break
    # 没有全量出现的字符,终止匹配
    else:
        break

print(prefix)

运行后输出结果为fl,符合预期。

修正方案2:无字典极简实现

你可以利用Python内置的zip()函数特性,不需要额外使用字典就能快速实现,代码更简洁易读:

alist = ["flower","flow","flight"]
prefix = ""
# zip(*列表)会将所有字符串同位置的字符打包为元组
for char_tuple in zip(*alist):
    # 元组去重后长度为1,说明当前位置所有字符相同,属于公共前缀
    if len(set(char_tuple)) == 1:
        prefix += char_tuple[0]
    else:
        break
print(prefix)

该方案自动以最短字符串长度为匹配上限,不需要额外处理索引越界问题,逻辑更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:24:01