检查列表元素与长文本的精确/乱序匹配并统计匹配数量
需求与问题
需要遍历给定列表,检查列表中每个元素与长字符串aapxjdnrbtvldptfzbbdbbzxtndrvjblnzjfpvhdhhpxjdnrbt是否满足以下任一条件:
- 精确匹配:元素直接作为子串出现在长字符串中
- 指定乱序匹配:元素与长字符串中某段等长子串首尾字母相同,其余字母可重排(即除首尾外的字符排序后完全一致)
最终需返回符合条件的元素数量,示例中应返回4。当前代码仅实现了精确匹配,得到结果为1,不符合预期,需补充乱序匹配的逻辑。
当前代码
long_string = 'aapxjdnrbtvldptfzbbdbbzxtndrvjblnzjfpvhdhhpxjdnrbt' my_list = [ 'axpaj', # 对应长字符串中的aapxj 'apxaj', # 对应长字符串中的aapxj 'dnrbt', # 精确匹配dnrbt 'pjxdn', # 对应长字符串中的pxjdn 'abd', ] matches = 0 for l in my_list: # check for exact match if l in long_string: matches += 1 # check for a scramble match # ... # matches = 1. Wrong should be 4. def is_anagram(str1, str2): str1_list = list(str1) str1_list.sort() str2_list = list(str2) str2_list.sort() return (str1_list == str2_list) is_anagram('axpaj' , 'aapxjdnrbtvldptfzbbdbbzxtndrvjblnzjfpvhdhhpxjdnrbt') ['a', 'a', 'j', 'p', 'x'] ['a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'd', 'd', 'd', 'd', 'd', ...]
修正方案
核心思路
乱序匹配需要同时满足三个条件:
- 列表元素与长字符串中的子串长度相同
- 两者首尾字符一致
- 除首尾外的字符排序后完全相同(即中间部分是字母重排)
完整修正代码
long_string = 'aapxjdnrbtvldptfzbbdbbzxtndrvjblnzjfpvhdhhpxjdnrbt' my_list = [ 'axpaj', # 对应长字符串中的aapxj 'apxaj', # 对应长字符串中的aapxj 'dnrbt', # 精确匹配dnrbt 'pjxdn', # 对应长字符串中的pxjdn 'abd', ] def is_scramble_match(s, long_str): s_len = len(s) long_len = len(long_str) if s_len > long_len: return False # 遍历长字符串中所有长度为s_len的子串 for i in range(long_len - s_len + 1): substring = long_str[i:i+s_len] # 检查首尾字符是否一致 if s[0] != substring[0] or s[-1] != substring[-1]: continue # 检查中间部分排序后是否相同 if sorted(s[1:-1]) == sorted(substring[1:-1]): return True return False matches = 0 for item in my_list: # 先检查精确匹配 if item in long_string: matches += 1 continue # 再检查乱序匹配 if is_scramble_match(item, long_string): matches += 1 print(matches) # 输出4,符合预期
代码说明
is_scramble_match函数:专门处理乱序匹配逻辑,遍历长字符串中所有等长子串,逐一验证首尾字符和中间排序后的字符是否一致。- 主循环逻辑:对每个列表元素,先判断是否精确匹配,若满足则直接计数;否则调用乱序匹配函数,满足则计数。
- 边界处理:如果列表元素长度超过长字符串,直接返回False,避免无效遍历。
内容的提问来源于stack exchange,提问作者csandreas1
相关产品推荐
相关产品推荐

