刷题ing | 豆包MarsCode AI刷题

31 阅读2分钟

创意标题匹配问题

问题描述:
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。

好的,让我们来详细分析一下这个问题,并提供一些解题思路。

问题解析

你有一个包含通配符 {} 的模板字符串,通配符可以包含0个或多个字符。你需要判断给定的多个标题是否可以通过替换模板中的通配符生成。

数据结构选择

  • 正则表达式:用于解析模板中的通配符和固定部分。
  • 字符串匹配:用于检查标题是否与模板匹配。

算法步骤

  1. 解析模板

    • 使用正则表达式提取模板中的固定部分和通配符部分。
    • 将固定部分和通配符部分分别存储。
  2. 构建正则表达式模式

    • 将固定部分用正则表达式转义,通配符部分用 .*? 表示。
    • 构建一个完整的正则表达式模式。
  3. 匹配标题

    • 对于每个标题,使用构建好的正则表达式模式进行匹配。
    • 检查标题是否完全匹配正则表达式模式。

具体思路

  1. 解析模板

    • 使用 re.compile(r'\{.*?\}') 来匹配模板中的通配符。
    • 使用 pattern.split(template_) 将模板分割成固定部分和通配符部分。
  2. 构建正则表达式模式

    • 遍历固定部分和通配符部分,将固定部分用 re.escape(part) 转义,通配符部分用 .*? 表示。
    • 构建一个完整的正则表达式模式。
  3. 匹配标题

    • 使用 regex.fullmatch(title) 来检查标题是否完全匹配正则表达式模式。
    • 如果匹配成功,则标题可以通过替换模板中的通配符生成;否则,不能生成。
完整代码如下:

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" )