1.问题描述
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。
2.测试样例
样例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"
3.代码实现
这题目考正则的,正则不是很熟悉,找ai同学问的表达式
思路就是将{}及中间部分用任意字符正则表达替换,生成正则规则,做验证就行
还有一点是常规生成的true和false都是小写,这里需要将首字母大写
function isPatternMatch(template, testStr) {
// 将模板中的占位符替换为正则表达式的非贪婪匹配
const regexStr = template
// 转义模板中的所有正则特殊字符(除了占位符部分)
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // 先转义所有特殊字符
// 然后将转义后的占位符恢复为未转义状态
.replace(/\\\{(.*?)\\\}/g, '(.*?)'); // 将{...}替换为(.*?)
// 创建正则表达式,确保完全匹配
const regex = new RegExp(`^${regexStr}$`);
const resultStr = String(regex.test(testStr))
return resultStr.charAt(0).toUpperCase() + resultStr.slice(1)
}
function solution(n, template_, titles) {
// Please write your code here
const result = titles.map(t=> {
return isPatternMatch(template_, t)
})
return result.join(',')
}
function main() {
// You can add more test cases here
const testTitles1 = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"];
const testTitles2 = ["CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"];
const testTitles3 = ["abcdefg", "abefg", "efg"];
console.log(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1) === "True,False,False,True");
console.log(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2) === "False,False,False,False,False,True");
console.log(solution(3, "a{bdc}efg", testTitles3) === "True,True,False");
}
main();