问题描述
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 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"
def solution(n, template, titles):
# Please write your code here
length = len(template)
key = template[length-1]
def compare(template, title):
if not template and not title:
return True
if not template:
if key == '}':
return True
else:
return False
if not title:
if template[0] == '{' and template[len(template)-1] == '}':
return True
else:
return False
if template[0] == '{':
brace = template.index('}')
for i in range(len(title) + 1):
if compare(template[brace + 1:], title[i:]):
return True
return False
if template[0] != title[0]:
return False
if template[0] == title[0]:
return compare(template[1:], title[1:])
results = []
for title in titles:
results.append(str(compare(template, title)))
# print(results)
results = ','.join(results)
print(results)
return results
代码思路解释
-
函数定义:
solution(n, template, titles):这是主函数,负责处理输入的n个标题,并返回一个字符串,表示每个标题是否符合模板。
-
辅助函数
compare:compare(template, title):这是一个递归函数,用于比较template和title是否匹配。
-
初始化:
length = len(template):计算模板的长度。key = template[length-1]:获取模板的最后一个字符,并将其存储在key变量中。
-
递归比较逻辑:
- 边界条件:
- 如果
template和title都为空,返回True。 - 如果
template为空,检查key是否为},如果是则返回True,否则返回False。 - 如果
title为空,检查template是否以{开头并以}结尾,如果是则返回True,否则返回False。
- 如果
- 处理通配符:
- 如果
template的第一个字符是{,找到对应的},并尝试匹配通配符部分。 - 使用
template.index('}')找到通配符的结束位置,然后递归比较剩余部分。
- 如果
- 字符匹配:
- 如果
template的第一个字符和title的第一个字符匹配,继续递归比较剩余部分。 - 如果不匹配,返回
False。
- 如果
- 边界条件:
-
结果收集:
- 遍历
titles,对每个标题调用compare函数,并将结果存储在results列表中。 - 最后将
results列表转换为逗号分隔的字符串并返回。
- 遍历