题目解析
问题描述
广告创意中允许使用通配符(形式为 {} 中括起的字符串),当用户的搜索词触发广告时,会替换通配符以生成标题。任务是判断一个给定的标题是否由某个创意通过替换通配符生成。
输入与输出
输入:
- n :标题数量。
- :含通配符的广告创意模板。
- : n 个标题组成的数组。
输出:
- 一个逗号分隔的字符串,每个值为
True或False,表示对应的标题是否符合模板规则。
解题思路
1. 正则表达式的设计
通过观察问题,我们发现模板中 {} 括起的通配符部分可以匹配任意字母串。于是,我们可以将模板中的 {...} 替换为正则表达式 [a-zA-Z]*,这样就能用生成的正则表达式去匹配每个标题。
步骤:
- 使用正则表达式
\{[^}]*\}匹配模板中的所有通配符。 - 将匹配到的部分替换为正则表达式
[a-zA-Z]*,生成模板对应的匹配规则。 - 用生成的正则表达式逐一匹配标题。
2. 字符串的处理与结果格式化
匹配的结果需要按顺序存储,并以逗号分隔的 True 或 False 输出。因此,程序需要:
- 遍历标题数组,依次进行匹配。
- 将匹配结果转为布尔值,并格式化为指定的输出形式。
3. 完整代码实现
以下是完整代码的实现:
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);
// 将通配符替换为正则表达式中的任意字母串
String regex2 = matcher.replaceAll("[a-zA-Z]*");
Pattern pattern2 = Pattern.compile(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(",");
}
}
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"));
}
}
知识总结
1. 正则表达式在字符串处理中的应用
正则表达式提供了强大的字符串匹配和替换功能。在本题中,我们通过以下两步解决了通配符匹配问题:
- 匹配模板中的通配符
\{[^}]*\}。 - 将匹配到的通配符替换为正则中的通配规则
[a-zA-Z]*。
2. 高效匹配与验证
通过预先处理模板生成正则表达式,然后逐一匹配标题,大幅简化了验证的逻辑,提高了代码的可读性与效率。
3. 边界条件的处理
在实际应用中,可能会出现一些特殊情况,如:
- 模板中没有通配符。
- 标题长度与模板差异较大。 这些都需要提前分析并通过测试用例覆盖。
学习心得:算法与工具的结合
通过本题的实现,我深刻体会到工具(如正则表达式)在解决复杂字符串处理问题中的价值。在学习算法时,结合常用的工具和库,可以大幅提升解题效率与实现质量。
对于类似问题的学习计划:
- 掌握正则表达式的基本语法与常用模式。
- 学习如何结合正则表达式与代码逻辑来解决问题。
- 通过多练习与实践,熟悉各种边界条件的处理方法。
希望本文能帮助你加深对通配符匹配问题的理解,并在算法学习中获得更多灵感!