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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:06:25