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

65 阅读2分钟

问题描述

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

输出:"True.False.True.True.True"

解题思路

  1. 模板转换为正则表达式

    • 将模板中的通配符 {} 替换为正则表达式中的 .*,表示任意字符(包括空字符串)。
    • 确保正则表达式匹配整个字符串,即在正则表达式的开头和结尾添加 ^ 和 $
  2. 匹配标题

    • 使用 Java 的 Pattern 和 Matcher 类来匹配每个标题是否符合转换后的正则表达式。
    • 如果匹配成功,则标题可以从模板生成;否则,不能从模板生成。
  3. 结果输出

    • 将每个标题的匹配结果存储在一个 StringBuilder 中,并用逗号分隔

关键步骤

  1. 模板转换

    • 使用 replaceAll("\{[^}]*}", ".*") 将模板中的通配符替换为 .*
    • 使用 ^ 和 $ 确保正则表达式匹配整个字符串。
  2. 匹配标题

    • 使用 Pattern.matches(regex, titles[i]) 检查每个标题是否匹配正则表达式。
  3. 结果存储

    • 使用 StringBuilder 存储每个标题的匹配结果,并用逗号分隔。

代码如下:

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) {
    //  测试样例1
    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"));
    }
}

总体时间复杂度:

  • 模板处理的时间复杂度是 O(m) ,其中 m 是模板字符串的长度。
  • 标题匹配的时间复杂度是 O(n * k) ,其中 n 是标题的数量,k 是标题字符串的平均长度。

因此,总体时间复杂度为: [ O(m + n * k) ] 其中:

  • m 是模板字符串的长度,
  • n 是标题数组的大小,
  • k 是每个标题字符串的平均长度。