创意标题匹配问题 刷题分享 | 豆包MarsCode AI 刷题

114 阅读4分钟

一、题目解析:创意标题匹配问题


问题描述

在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 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"

题目思路:

  1. 题目分析
    我们需要判断一个标题是否可以从一个含有通配符的模板中生成。通配符用 {} 括起来,可以包含任意数量的字符。例如,模板 "ad{xyz}cdc{y}f{x}e" 可以生成标题 "adcdcefdfeffe",因为 {xyz} 可以替换为 cdc{y} 可以替换为 e{x} 可以替换为 dfeff

  2. 数据结构选择
    正则表达式:你可以将模板转换为正则表达式,其中 {} 内的部分用 .* 表示,表示任意数量的任意字符。然后使用正则表达式来匹配标题。

  3. 算法步骤
    模板转换:将模板中的 {} 部分替换为 .*,并在模板的前后加上 ^ 和 $,确保匹配整个字符串。
    正则匹配:对每个标题,使用生成的正则表达式进行匹配。
    结果存储:将匹配结果存储在一个字符串中,用逗号分隔。

  4. 代码实现(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"));
    }
}

二、知识总结


代码解析:

  1. 模板转换

    • 使用 replaceAll 方法将 {} 内的部分替换为 .*
    • 在模板的前后加上 ^ 和 $,确保匹配整个字符串。
  2. 正则匹配

    • 使用 Pattern.matches 方法对每个标题进行匹配。
  3. 结果存储

    • 使用 StringBuilder 来存储匹配结果,并在每个结果之间加上逗号。

三、学习计划


高效利用豆包MarsCode AI

新手刷题可以使用以下高效学习方法:

  1. 明确目标,规划时间:每天坚持刷题,从简到难。可以使用豆包MarsCode AI中的“每日推荐”功能制定每日刷题目标,并合理分配时间。
  2. 解析并记录错题:错题重点关注思路和代码实现的差距。通过豆包MarsCode AI的解析功能,找到重难点,并记录在笔记中。
  3. 遇难题逐步突破:将较复杂的题目拆解为小步骤,利用AI的提示功能逐个实现。

错题学习建议

  • 回顾易错知识点。
  • 对比代码与解析代码,找出差异。

四、工具运用


豆包MarsCode AI 在刷题中可以提供十分详细的题解和代码智能纠错功能,还可以寻找网上相关资源整合解决难点:

  1. 参考书籍:例如《算法导论》等。
  2. 在线文档和视频:结合LeetCode、Github等平台的算法教程,与豆包MarsCode解析互补使用。
  3. 实践项目:将学到的知识应用于实践项目,进一步加深理解。

五、总结


通过使用豆包MarsCode AI 刷题工具,使得解题效率、知识总结和错题分析等能力上得到了明显提升。

与相同青训营的同好之志一同学习也能增进相关的结识,与之一同进步,希望这篇分享文章能够帮助到同为初学者之志。