问题描述
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 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"
import java.util.regex.*;
/**
* 直接正则匹配
*/
public class Main {
public static String solution(int n, String template, String[] titles) {
// 正则匹配模板中的通配符
String regex1 = "\\{[^}]*\\}"; // 匹配被花括号 {} 包围的文本
Pattern pattern1 = Pattern.compile(regex1);
Matcher matcher = pattern1.matcher(template);
System.out.println(matcher.pattern());
// 将通配符替换为正则表达式中的任意字母串 [a-zA-Z]* 替换 {[^}]*}
String regex2 = matcher.replaceAll("[a-zA-Z]*");
Pattern pattern2 = Pattern.compile(regex2);
System.out.println(regex2);
// 遍历标题数组进行匹配
StringBuilder result = new StringBuilder();
for (int i = 0; i < titles.length; i++) {
// 使用正则匹配
Matcher matcher2 = pattern2.matcher(titles[i]);
result.append((matcher2.matches() + "").replace("t", "T").replace("f", "F"));
if (i != titles.length - 1) {
result.append(",");
}
// System.out.println(result);
}
return result.toString();
}
public static void main(String[] args) {
// 测试用例
String[] testTitles1 = { "adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe" };
String[] testTitles2 = { "CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj",
"CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx" };
String[] testTitles3 = { "abcdefg", "abefg", "efg" };
System.out.println(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1).compareToIgnoreCase("True,False,False,True"));
System.out.println(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2)
.compareToIgnoreCase("False,False,False,False,False,True"));
System.out.println(solution(3, "a{bdc}efg", testTitles3).compareToIgnoreCase("True,True,False"));
}
}