创意标题匹配问题分析 | 豆包MarsCode AI刷题

97 阅读4分钟

引言

在编程学习与实践过程中,深入分析各类问题并总结解题思路和代码实现方式是提升能力的重要途径。本次针对题库中的创意标题匹配问题展开详细剖析,并分享个人在探索过程中的学习心得。通过对该问题的研究,我们不仅能够掌握特定问题的解决方案,还能进一步理解正则表达式在字符串处理中的应用以及编程逻辑的构建方法。

题目具体描述

Snipaste_2024-11-13_20-30-21.png

题目关键信息

  • “线上服务会根据用户搜索词触发的 bidword 对创意中的通配符进行替换。”

  • “通配符是用成对括号括起来的字符串、可以包含任意数量的字符或者没有字符。”

  • “给定一个含有通配符的创意以及多个(n 个)标题,判断这些标题是否是由该创意经过通配符替换后生成的。”

解题思路

  1. 字符逐一比较策略:采用遍历创意和标题字符的方式,逐个进行比较。这是一种基础且直观的方法,能够确保对每个字符的细致检查。
  2. 普通字符匹配判断:当遇到普通字符时,直接对比创意和标题中的对应字符。若二者不相同,则可立即判定该标题不是由创意生成的,从而提前结束对该标题的判断流程,提高效率。
  3. 通配符处理逻辑:当遇到通配符时,首先要准确确定其范围,即从左括号到右括号之间的内容。这是处理通配符的关键步骤,只有明确了通配符所代表的具体内容,才能在标题中进行有效的查找。
  4. 标题中查找通配符内容:在确定通配符范围后,于标题中查找通配符对应的内容。如果能够找到匹配内容,则继续从通配符后的位置继续比较创意和标题;若找不到,则可确定该标题不符合要求,返回 False。
  5. 完全匹配验证:在整个比较过程中,必须确保创意和标题都完全遍历完,即两者的长度都被完全消耗。只有满足这一条件,才能最终确定标题是由创意生成的,避免因部分匹配而产生误判。

Python代码


def solution(n, template, titles):
    # 将模板中的通配符替换成正则表达式匹配模式
    pattern = re.sub(r'\{.*?\}', '.*', template)
    pattern = '^' + pattern + '$'  # 让匹配模式从头到尾完全匹配
    
    # 逐个标题进行匹配
    results = []
    for title in titles:
        if re.match(pattern, title):
            results.append("True")
        else:
            results.append("False")
    
    return ",".join(results)

if __name__ == "__main__":
    # 测试用例
    testTitles1 = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]
    testTitles2 = ["CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"]
    testTitles3 = ["abcdefg", "abefg", "efg"]

    print(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1) == "True,False,False,True")
    print(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2) == "False,False,False,False,False,True")
    print(solution(3, "a{bdc}efg", testTitles3) == "True,True,False")

  1. 正则表达式替换通配符

    • 代码使用 re.sub 函数将模板中的通配符(花括号括起来的内容)替换成正则表达式的 .*。这里的 .* 表示匹配任意数量的字符,包括空字符。通过这种方式,将通配符转换为正则表达式能够理解的匹配模式,从而为后续的标题匹配提供基础。例如,对于模板 “ad{xyz}cdc{y}f{x}e”,经过替换后变为 “ad.*cdc.*f.*e”。
    • 接着在替换后的模式前后加上 ^ 和 $,这是为了确保匹配模式从头到尾完全匹配。^ 表示匹配字符串的开头,$ 表示匹配字符串的结尾。这样设置可以避免部分匹配的情况,只有当整个标题完全符合转换后的正则表达式模式时,才会被判定为匹配成功。
  2. 标题匹配过程

    • 在逐个标题进行匹配时,使用 re.match 函数对标题和生成的正则表达式模式进行匹配。re.match 函数会从字符串的开头开始尝试匹配,如果开头部分不符合模式,则立即返回 None,不再继续匹配后续内容。这与我们的解题思路中从标题开头逐步比较创意的逻辑相契合,保证了匹配的准确性和效率。
    • 如果 re.match 函数返回的结果不为 None,即表示标题与模式匹配成功,此时将 "True" 添加到 results 列表中;反之,如果匹配失败,则添加 "False"
  3. 结果处理与返回

    • 最后,使用 ",".join(results) 将 results 列表中的元素连接成一个字符串并返回。这样返回的字符串能够清晰地展示每个标题与创意的匹配情况,方便查看和进一步处理结果。

代码主要步骤

  1. 使用 re.sub 函数将模板中的通配符(花括号括起来的内容)替换成正则表达式的 . *(表示匹配任意数量的字符),并在前后加上 ^ 和 $,确保完全匹配。
  2. 遍历 titles 列表中的每个标题,使用 re.match 函数对标题和生成的正则表达式模式进行匹配。如果匹配成功,将 "True" 添加到 results 列表中;否则,添加 "False"
  3. 使用 ",".join(results) 将 results 列表中的元素连接成一个字符串并返回。

总结

通过代码实现,我们深入理解了如何利用正则表达式处理含有通配符的字符串匹配问题。在实际应用中,类似的字符串处理任务非常常见,例如在文本搜索、数据过滤、配置文件解析等领域都可能会遇到。我们可以进一步拓展该代码的功能,比如增加对通配符更复杂规则的支持,如限定通配符内字符的类型、数量范围等;或者优化代码性能,当处理大量标题和复杂模板时,考虑采用更高效的字符串处理算法或数据结构。此外,还可以探索如何更好地处理错误情况,例如当模板格式错误、标题为空等情况时,提供更友好的错误提示信息,以增强程序的健壮性和用户体验。总之,本题为我们提供了一个很好的字符串处理和编程逻辑构建的实践案例,有助于我们在编程学习和实践中不断提升解决实际问题的能力。