Python如何判断字符串是否仅由指定单词列表中的单词构成
问题说明
给定合法单词列表:
words = ['ABC', 'CDE', 'EFG']
需要实现校验逻辑:判断输入字符串是否仅由列表内的单词(单词间以空格分隔)组成,满足以下校验规则:
- 字符串拆分后的每个单词都必须属于上述合法单词列表
- 单词可以重复使用,字符串包含的单词总个数不设限
- 示例:
'EFG CDE'、'EFG EFG CDE'、'CDE CDE CDE CDE'都应返回True
原有实现通过itertools.permutations生成固定长度(2个或3个单词)、单词不重复的排列组合,再判断目标字符串是否在枚举结果中,只能覆盖极少量场景,无法适配单词重复、单词数任意的合法字符串。本质上合法字符串的可能数量是无限的,枚举思路从根源上就不可行。
正确实现
核心逻辑非常简单:不需要提前枚举任何合法组合,直接将待校验字符串按空格拆分为单词片段,逐个校验每个片段是否在合法单词集合内即可,时间复杂度低,适配任意长度的输入。
def check_valid(input_str, valid_words): # 转为集合提升成员判断效率 valid_set = set(valid_words) # split()不传参时自动忽略前后空格、连续空格,拆分出所有单词片段 parts = input_str.split() # 所有片段都在合法集合中则返回True return all(part in valid_set for part in parts) # 测试验证 words = ['ABC', 'CDE', 'EFG'] print(check_valid('EFG CDE', words)) # True print(check_valid('EFG EFG CDE', words)) # True print(check_valid('CDE CDE CDE CDE', words)) # True print(check_valid('ABC XYZ', words)) # False,存在不在列表内的XYZ print(check_valid(' ABC CDE ', words)) # True,自动忽略多余空格
补充:如果业务场景要求多个单词间只能有单个空格、不允许存在前后空格,可以把拆分逻辑换成
input_str.split(' '),再额外判断拆分结果中是否存在空片段即可。
内容的提问来源于stack exchange,提问作者sim
相关产品推荐
相关产品推荐

