在广告平台中,广告主可以通过通配符的方式提交广告标题,以增加创意的灵活性和效率。通配符用成对的花括号 {} 括起来,可以包含任意数量的字符。线上服务时,系统会根据用户的搜索词触发的 bidword 对创意中的通配符进行替换,以提升广告投放体验。例如,广告标题“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”可能会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。
本题的目标是给定一个含有通配符的创意模板和一组标题,判断这些标题是否是从该创意模板替换生成的。
问题分析
输入与输出
-
输入:
n:标题的数量。template:含有通配符的创意模板。titles:一组标题。
-
输出:
- 一个字符串,表示每个标题是否从模板生成,格式为
"True,False,False,True"。
- 一个字符串,表示每个标题是否从模板生成,格式为
关键点
- 通配符的处理:通配符用
{}括起来,可以包含任意数量的字符。在模板中,通配符可以出现在任意位置,并且可以有多个通配符。 - 匹配规则:标题必须完全匹配模板,包括通配符和固定字符的位置和顺序。
解题思路
数据结构选择
- 正则表达式:由于模板中包含通配符,使用正则表达式可以方便地处理通配符的匹配问题。
算法步骤
-
解析模板:
- 将模板中的通配符
{}替换为正则表达式的通配符(.*?),表示匹配任意字符(非贪婪模式)。 - 在模板的前后添加
^和$,表示匹配整个字符串的开头和结尾。
- 将模板中的通配符
-
遍历标题:
- 对于每个标题,使用正则表达式的
re.match方法判断是否匹配模板。 - 如果匹配成功,则标题是从模板生成的,否则不是。
- 对于每个标题,使用正则表达式的
-
存储结果:
- 将每个标题的匹配结果存储在一个列表中。
- 最后将列表转换为字符串,格式为
"True,False,False,True"。
代码实现
以下是使用 Python 实现的代码框架:
python
import re
def solution(n, template, titles):
# 解析模板,提取通配符和固定字符
pattern = re.sub(r'{.*?}', '{}
', template)
pattern = '^' + pattern.replace
('{}', '(.*?)') + '$'
# 用于存储结果
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")
总结
本题的核心在于如何处理模板中的通配符,并将其转换为正则表达式进行匹配。通过正则表达式,我们可以灵活地处理通配符的匹配问题,并且能够高效地判断标题是否从模板生成。在实际应用中,这种技术可以广泛应用于广告创意的生成和匹配,提升广告投放的精准度和用户体验。