Python实现多字符串公共字符提取(不使用Counter函数)
提取字符串列表公共字符的非Counter解法提示
嘿,你已经完成了最关键的第一步——把每个字符串的字符频次都统计好了,接下来其实就差两步就能拿到结果啦!
核心思路很简单:公共字符一定是所有字符串都包含的字符,而且它在结果里出现的次数等于所有字符串中该字符频次的最小值。给你拆解下具体要做的事:
- 先拿第一个字符串的字符计数字典当基准(毕竟公共字符肯定得在第一个字符串里存在嘛)
- 遍历这个基准里的每一个字符,检查它是不是在其他所有字符串的字典里都有
- 如果有,就把所有字典里这个字符的频次找出来,取最小的那个数——这个数就是它在结果里该出现的次数
- 如果某个字符串里没有这个字符,那它肯定不是公共字符,直接跳过
- 最后把每个符合条件的字符,重复对应次数后放进结果列表就行
给你把代码补全一下,在你原来的commonChars方法里,print(dic)之后加上这段:
result = [] # 以第一个字符串的字符统计为基准 base_counts = dic[0] for char, count in base_counts.items(): min_count = count # 检查其他所有字符串的统计结果 for idx in range(1, len(dic)): # 如果当前字符不在这个字符串里,直接标记为非公共字符 if char not in dic[idx]: min_count = 0 break # 更新最小出现次数 if dic[idx][char] < min_count: min_count = dic[idx][char] # 如果最小次数大于0,就把字符重复对应次数加入结果 if min_count > 0: result.extend([char] * min_count) return result
拿你给的输入1测试下:
- 基准是
{'a':1, 'b':1, 'e':1, 'l':2} - 遍历到'a'时,第三个字符串的字典里没有它,直接跳过;'b'同理
- 'e'在三个字典里的频次都是1,所以加入1次;'l'的频次都是2,加入2次,最终得到
["e","l","l"],完全符合预期
输入2的话,基准是{'c':1, 'o':2, 'l':1}:
- 'c'在三个字典里都有,最小频次是1,加入1次
- 'o'的频次分别是2、1、2,最小是1,加入1次
- 'l'在第三个字符串的字典里没有,跳过
- 最终得到
["c","o"],也符合预期
内容的提问来源于stack exchange,提问作者Ns68
相关产品推荐
相关产品推荐

