使用Counter实现的最长公共前缀代码在边缘用例返回错误前缀的原因
最长公共前缀算法在边缘用例失效的原因
我编写了一个暴力算法来提取多个输入字符串的最长公共前缀,该代码在大多数测试用例中正常工作,但在诸如strs = ["reflower","flow","flight"]的边缘用例中失效——本该返回"",实际却返回了"fl"。
我的代码如下:
from collections import Counter from typing import List # 补充原代码遗漏的导入,避免类型报错 class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if len(strs) == 1: return strs[0] mini =[] for i in strs: l = len(i) print(l) mini.append(l) print("minimum",min(mini)) minimum = min(mini) strs.sort(key=len) print(strs) #pointer initialization l = 0 r = len(strs)-1 cp = [] while l<r: l1 = strs[l] r1 = strs[r] for i in range(minimum): if l1[i] == r1[i]: cp.append(l1[i]) else: break r-=1 if not cp: return "" counter = Counter(cp) max_frequency = max(counter.values()) most_frequent =[k for k,v in counter.items() if v==max_frequency] ans = ''.join(most_frequent) # print(ans) return ans
失效原因分析
核心逻辑误解最长公共前缀定义
最长公共前缀要求所有输入字符串在对应位置的字符完全相同,但你的代码逻辑是收集两两字符串的公共字符,再统计出现次数最多的字符拼接结果——这完全不符合需求。比如测试用例中,"flow"和"reflower"、"flow"和"flight"的前两个字符都相同,但"reflower"和"flight"的前两个字符完全不同,因此整个集合不存在公共前缀,但你的代码没有验证所有字符串的一致性。while循环错误收集字符
测试用例按长度排序后变为["flow","flight","reflower"]:- 第一次循环:对比
"flow"和"reflower",前2个字符'f'、'l'相等,cp被添加为['f','l'] - 第二次循环:对比
"flow"和"flight",前2个字符'f'、'l'相等,cp被追加为['f','l','f','l']
循环结束后,Counter统计出'f'和'l'各出现2次,于是拼接成"fl"返回,完全忽略了"reflower"和"flight"没有公共前缀的事实。
- 第一次循环:对比
错误依赖最短字符串的公共部分
你默认最短字符串与其他字符串的公共部分就是所有字符串的公共前缀,但实际上最短字符串可能仅和部分字符串有公共前缀,和另一部分没有,此时整个集合的公共前缀应为空,你的代码没有做全局验证。
内容的提问来源于stack exchange,提问作者Viknesh Raj
相关产品推荐
相关产品推荐

