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

40 阅读4分钟

问题描述

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


测试样例

样例1:

输入:n = 4, template = "ad{xyz}cdc{y}f{x}e", titles = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"] 输出:"True,False,False,True"

样例2:

输入:n = 3, template = "a{bdc}efg", titles = ["abcdefg", "abefg", "efg"] 输出:"True,True,False"

样例3:

输入:n = 5, template = "{abc}xyz{def}", titles = ["xyzdef", "abcdef", "abxyzdef", "xyz", "abxyz"] 输出:"True,False,True,True,True"

题目背景

广告平台为了提升广告的匹配效果,允许广告主使用通配符 {} 提交创意模板。在用户搜索时,系统会用搜索词或其他关键词替换模板中的通配符,从而生成实际的广告标题。 本题的目的是: 给定一个创意模板和多个标题,判断这些标题是否能由该模板通过替换通配符生成。

题目要求

  • 输入:

    1. n:标题的数量。
    2. template:创意模板,包含若干通配符 {},每个通配符可以被替换为任意字符串(包括空字符串)。
    3. titles:长度为 n 的标题列表,需判断这些标题是否由模板生成。
  • 输出:

    • 返回一个以逗号分隔的字符串,其中每个值为 TrueFalse,表示对应标题是否符合模板。

问题分解

  1. 模板中的通配符替换规则

    • 通配符 {xyz} 被替换时,可以被任何字符串替换,包括空字符串。
    • 例如:模板 "ad{xyz}bc" 可以生成 "adbc""ad123bc""adhelloworldbc"
  2. 验证标题生成的核心逻辑

    • 模板经过通配符替换后,标题必须完全匹配模板的结构:

      • 模板中的固定部分不能被改变。
      • 通配符部分可替换为任意内容。
  3. 解决方案的关键

    • 将模板中的通配符 {} 转换为正则表达式中的 .*(匹配任意字符,包括空字符)。
    • 使用正则表达式验证每个标题是否完全匹配该规则。

解决方案设计

  1. 解析模板

    • 将模板中的通配符

       {}
      

      转换为正则表达式中的

       .*
      

      ,从而形成一个匹配规则。

      • 示例:模板 "ad{xyz}cdc{y}f{x}e" 转换为正则表达式 "ad.*cdc.*f.*e"
  2. 验证标题

    • 使用正则表达式的 fullmatch 方法逐一验证每个标题是否完全匹配转换后的模板规则。
  3. 结果输出

    • 遍历标题列表,对每个标题验证结果存储为 TrueFalse,最后返回逗号分隔的字符串。

边界情况

  1. 模板没有通配符

    • 如果模板中没有 {},标题必须完全与模板一致才能返回 True
  2. 标题为空

    • 如果模板中通配符可以替换为空字符串,则可能生成空标题。
  3. 标题数量为 0

    • n = 0,直接返回空字符串。

复杂度分析

  1. 时间复杂度

    • 模板转换为正则表达式的复杂度为 O(m),其中 m 为模板字符串的长度。
    • 验证每个标题的复杂度为 O(k⋅t),其中 k 为标题数量,t 为标题的平均长度。
    • 总体复杂度为 O(m+k⋅t)。
  2. 空间复杂度

    • 正则表达式和结果存储的额外空间为 O(m+k)。

示例代码

 import re
 ​
 def solution(n, template_, titles):
     # 将模板中的通配符 {} 转换为正则表达式中的 .*
     regex_template=re.sub('{[a-zA-Z]+}','.*',template_)
     #regex_template = template_.replace('{', '.*').replace('}', '')
     # 编译正则表达式
     pattern = re.compile(regex_template)
     
     results = []
     for title in titles:
         # 使用正则表达式匹配标题
         if pattern.fullmatch(title):
             results.append(True)
         else:
             results.append(False)
     
     return ','.join(map(str, results))