Python中如何检查含重复元素的列表是否为另一列表的子列表
解决字符重复场景下的单词有效性判断问题
原代码的核心问题在于错误的计数逻辑:只要板中存在单词里的字符就累加tracker,完全没考虑字符的重复次数限制,也没检查单词里的所有字符是否都存在于板中。要同时处理两类重复问题,正确的思路是用字符频次统计来做匹配。
正确实现方案
我们可以用collections.Counter来统计板中所有字符的出现次数,然后对每个单词做同样的频次统计,逐一验证单词中每个字符的出现次数都不超过板中的对应次数,同时满足长度要求。
from collections import Counter def filter_valid_words(dictionary, board): # 把二维board扁平化为所有字符的列表,统计每个字符的出现次数 board_chars = [char for row in board for char in row] board_counter = Counter(board_chars) valid_words = [] for word in dictionary: # 先检查单词长度是否符合要求 if 3 <= len(word) <= 16: word_counter = Counter(word) # 验证单词的每个字符频次都不超过板中的频次 is_valid = True for char, count in word_counter.items(): if board_counter.get(char, 0) < count: is_valid = False break if is_valid: valid_words.append(word) # 按长度倒序排序 valid_words.sort(key=len, reverse=True) print('Words available:', len(valid_words)) return valid_words
代码说明
- 字符频次统计:
board_counter记录了板中每个字符的总出现次数,word_counter记录当前单词的字符频次。 - 有效性验证:遍历单词的每个字符,只要有一个字符的出现次数超过板中的数量,就判定为无效;如果所有字符都满足频次要求,且长度符合,就加入有效列表。
- 排序输出:最后按单词长度倒序排列,和原代码逻辑保持一致。
测试示例
- 当板为
[['A','B'],['C','D']]时,单词'ABC'会被判定有效,'ABCC'会因为板中只有1个C而被排除。 - 当板为
[['A','B'],['C','C']]时,单词'ABCD'会因为板中没有D而被排除,不会出现误判。
方案优势
- 处理板中有重复字符但单词不需要那么多的情况(比如板有2个C,单词要1个C,允许);
- 处理单词有重复字符但板中数量不够的情况(比如板有1个C,单词要2个C,拒绝);
- 正确识别单词中存在板里没有的字符的情况(直接拒绝)。
内容的提问来源于stack exchange,提问作者Angelo Chen
相关产品推荐
相关产品推荐

