一、题目解析:创意标题匹配问题
问题描述
在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 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"
题目思路:
-
题目分析:
我们需要判断一个标题是否可以从一个含有通配符的模板中生成。通配符用{}括起来,可以包含任意数量的字符。例如,模板"ad{xyz}cdc{y}f{x}e"可以生成标题"adcdcefdfeffe",因为{xyz}可以替换为cdc,{y}可以替换为e,{x}可以替换为dfeff。 -
数据结构选择:
正则表达式:你可以将模板转换为正则表达式,其中{}内的部分用.*表示,表示任意数量的任意字符。然后使用正则表达式来匹配标题。 -
算法步骤
模板转换:将模板中的{}部分替换为.*,并在模板的前后加上^和$,确保匹配整个字符串。
正则匹配:对每个标题,使用生成的正则表达式进行匹配。
结果存储:将匹配结果存储在一个字符串中,用逗号分隔。 -
代码实现(Java) :
import java.util.regex.Pattern;
public class Main {
public static String solution(int n, String template, String[] titles) {
// 将模板转换为正则表达式
String regex = template.replaceAll("\\{[^}]*}", ".*");
regex = "^" + regex + "$"; // 确保匹配整个字符串
// 创建一个StringBuilder来存储结果
StringBuilder result = new StringBuilder();
// 检查每个标题是否匹配正则表达式
for (int i = 0; i < n; i++) {
if (Pattern.matches(regex, titles[i])) {
result.append("True");
} else {
result.append("False");
}
if (i < n - 1) {
result.append(",");
}
}
return result.toString();
}
public static void main(String[] args) {
// You can add more test cases here
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).equals("True,False,False,True"));
System.out.println(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2).equals("False,False,False,False,False,True"));
System.out.println(solution(3, "a{bdc}efg", testTitles3).equals("True,True,False"));
}
}
二、知识总结
代码解析:
-
模板转换:
- 使用
replaceAll方法将{}内的部分替换为.*。 - 在模板的前后加上
^和$,确保匹配整个字符串。
- 使用
-
正则匹配:
- 使用
Pattern.matches方法对每个标题进行匹配。
- 使用
-
结果存储:
- 使用
StringBuilder来存储匹配结果,并在每个结果之间加上逗号。
- 使用
三、学习计划
高效利用豆包MarsCode AI
新手刷题可以使用以下高效学习方法:
- 明确目标,规划时间:每天坚持刷题,从简到难。可以使用豆包MarsCode AI中的“每日推荐”功能制定每日刷题目标,并合理分配时间。
- 解析并记录错题:错题重点关注思路和代码实现的差距。通过豆包MarsCode AI的解析功能,找到重难点,并记录在笔记中。
- 遇难题逐步突破:将较复杂的题目拆解为小步骤,利用AI的提示功能逐个实现。
错题学习建议
- 回顾易错知识点。
- 对比代码与解析代码,找出差异。
四、工具运用
豆包MarsCode AI 在刷题中可以提供十分详细的题解和代码智能纠错功能,还可以寻找网上相关资源整合解决难点:
- 参考书籍:例如《算法导论》等。
- 在线文档和视频:结合LeetCode、Github等平台的算法教程,与豆包MarsCode解析互补使用。
- 实践项目:将学到的知识应用于实践项目,进一步加深理解。
五、总结
通过使用豆包MarsCode AI 刷题工具,使得解题效率、知识总结和错题分析等能力上得到了明显提升。
与相同青训营的同好之志一同学习也能增进相关的结识,与之一同进步,希望这篇分享文章能够帮助到同为初学者之志。