问题描述
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 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"
题目背景
广告平台为了提升广告的匹配效果,允许广告主使用通配符 {} 提交创意模板。在用户搜索时,系统会用搜索词或其他关键词替换模板中的通配符,从而生成实际的广告标题。 本题的目的是: 给定一个创意模板和多个标题,判断这些标题是否能由该模板通过替换通配符生成。
题目要求
-
输入:
n:标题的数量。template:创意模板,包含若干通配符{},每个通配符可以被替换为任意字符串(包括空字符串)。titles:长度为n的标题列表,需判断这些标题是否由模板生成。
-
输出:
- 返回一个以逗号分隔的字符串,其中每个值为
True或False,表示对应标题是否符合模板。
- 返回一个以逗号分隔的字符串,其中每个值为
问题分解
-
模板中的通配符替换规则:
- 通配符
{xyz}被替换时,可以被任何字符串替换,包括空字符串。 - 例如:模板
"ad{xyz}bc"可以生成"adbc"、"ad123bc"、"adhelloworldbc"。
- 通配符
-
验证标题生成的核心逻辑:
-
模板经过通配符替换后,标题必须完全匹配模板的结构:
- 模板中的固定部分不能被改变。
- 通配符部分可替换为任意内容。
-
-
解决方案的关键:
- 将模板中的通配符
{}转换为正则表达式中的.*(匹配任意字符,包括空字符)。 - 使用正则表达式验证每个标题是否完全匹配该规则。
- 将模板中的通配符
解决方案设计
-
解析模板:
-
将模板中的通配符
{}转换为正则表达式中的
.*,从而形成一个匹配规则。
- 示例:模板
"ad{xyz}cdc{y}f{x}e"转换为正则表达式"ad.*cdc.*f.*e"。
- 示例:模板
-
-
验证标题:
- 使用正则表达式的
fullmatch方法逐一验证每个标题是否完全匹配转换后的模板规则。
- 使用正则表达式的
-
结果输出:
- 遍历标题列表,对每个标题验证结果存储为
True或False,最后返回逗号分隔的字符串。
- 遍历标题列表,对每个标题验证结果存储为
边界情况
-
模板没有通配符:
- 如果模板中没有
{},标题必须完全与模板一致才能返回True。
- 如果模板中没有
-
标题为空:
- 如果模板中通配符可以替换为空字符串,则可能生成空标题。
-
标题数量为 0:
- 若
n = 0,直接返回空字符串。
- 若
复杂度分析
-
时间复杂度:
- 模板转换为正则表达式的复杂度为 O(m),其中 m 为模板字符串的长度。
- 验证每个标题的复杂度为 O(k⋅t),其中 k 为标题数量,t 为标题的平均长度。
- 总体复杂度为 O(m+k⋅t)。
-
空间复杂度:
- 正则表达式和结果存储的额外空间为 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))