创意标题匹配问题详解 | 豆包MarsCode AI刷题

62 阅读2分钟

首先让我们先回顾一下问题是什么

问题回顾

在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。

测试样例

样例

输入:n = 4, template = "ad{xyz}cdc{y}f{x}e", titles = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]
输出:"True,False,False,True"

问题解决思路

要解决这个问题,我们需要编写一个函数 solution,该函数接受三个参数:

  1. n:标题的数量。
  2. template_:包含通配符的创意模板。
  3. titles:需要判断的标题数组。

我们的目标是检查每个标题是否可以通过替换模板中的通配符生成。为了实现这一点,我们可以使用正则表达式来匹配和替换通配符。

问题解决的具体步骤为:

  1. 将模板中的通配符转换为正则表达式模式。例如,{xyz} 可以转换为 (.*),表示任意字符(包括空字符)。
  2. 使用转换后的正则表达式模式来匹配每个标题。
  3. 如果标题匹配正则表达式模式,则返回 True,否则返回 False

核心代码

import java.util.regex.*;
public class Main {
    public static String solution(int n, String template_, String[] titles) {
        String regexPattern = template_.replaceAll("\\{[^{}]*\\}", "(.*)");
        Pattern pattern = Pattern.compile(regexPattern);
        StringBuilder result = new StringBuilder();
        for (String title : titles) {
            Matcher matcher = pattern.matcher(title);
            if (matcher.matches()) {
                result.append("True,");
            } else {
                result.append("False,");
            }
        }
        return result.substring(0, result.length() - 1);
    }
    public static void main(String[] args) {
        String[] testTitles1 = {"adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"};
        System.out.println(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1).equals("True,False,False,True"));
    }
}

代码的解释:

解释

  1. 模板转换:我们将模板中的每个通配符 {...} 替换为正则表达式中的 (.*),表示任意字符序列。
  2. 正则表达式编译:使用 Pattern.compile 方法将转换后的字符串编译成正则表达式模式。
  3. 匹配检查:对于每个标题,使用 Matcher 对象检查它是否与编译后的正则表达式模式匹配。如果匹配,则返回 True,否则返回 False
  4. 结果拼接:将所有匹配结果拼接成一个字符串,并去掉最后一个多余的逗号。

通过这种方式,我们可以有效地判断每个标题是否可以通过替换模板中的通配符生成。

结果呈现:

image.png