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

检查列表元素与长文本的精确/乱序匹配并统计匹配数量

需求与问题

需要遍历给定列表,检查列表中每个元素与长字符串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', ...]

修正方案

核心思路

乱序匹配需要同时满足三个条件:

  1. 列表元素与长字符串中的子串长度相同
  2. 两者首尾字符一致
  3. 除首尾外的字符排序后完全相同(即中间部分是字母重排)

完整修正代码

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,符合预期

代码说明

  1. is_scramble_match函数:专门处理乱序匹配逻辑,遍历长字符串中所有等长子串,逐一验证首尾字符和中间排序后的字符是否一致。
  2. 主循环逻辑:对每个列表元素,先判断是否精确匹配,若满足则直接计数;否则调用乱序匹配函数,满足则计数。
  3. 边界处理:如果列表元素长度超过长字符串,直接返回False,避免无效遍历。

内容的提问来源于stack exchange,提问作者csandreas1

相关产品推荐
方舟 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