创意标题匹配问题(青训营X豆包MarsCode)|豆包MarsCode AI刷题

100 阅读3分钟

题目解析

问题描述

广告创意中允许使用通配符(形式为 {} 中括起的字符串),当用户的搜索词触发广告时,会替换通配符以生成标题。任务是判断一个给定的标题是否由某个创意通过替换通配符生成。

输入与输出

输入:

  • n :标题数量。
  • template\text{template} :含通配符的广告创意模板。
  • titles\text{titles} : n 个标题组成的数组。

输出:

  • 一个逗号分隔的字符串,每个值为 TrueFalse,表示对应的标题是否符合模板规则。

解题思路

1. 正则表达式的设计

通过观察问题,我们发现模板中 {} 括起的通配符部分可以匹配任意字母串。于是,我们可以将模板中的 {...} 替换为正则表达式 [a-zA-Z]*,这样就能用生成的正则表达式去匹配每个标题。

步骤:

  1. 使用正则表达式 \{[^}]*\} 匹配模板中的所有通配符。
  2. 将匹配到的部分替换为正则表达式 [a-zA-Z]*,生成模板对应的匹配规则。
  3. 用生成的正则表达式逐一匹配标题。

2. 字符串的处理与结果格式化

匹配的结果需要按顺序存储,并以逗号分隔的 TrueFalse 输出。因此,程序需要:

  • 遍历标题数组,依次进行匹配。
  • 将匹配结果转为布尔值,并格式化为指定的输出形式。

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. 正则表达式在字符串处理中的应用

正则表达式提供了强大的字符串匹配和替换功能。在本题中,我们通过以下两步解决了通配符匹配问题:

  1. 匹配模板中的通配符 \{[^}]*\}
  2. 将匹配到的通配符替换为正则中的通配规则 [a-zA-Z]*

2. 高效匹配与验证

通过预先处理模板生成正则表达式,然后逐一匹配标题,大幅简化了验证的逻辑,提高了代码的可读性与效率。

3. 边界条件的处理

在实际应用中,可能会出现一些特殊情况,如:

  • 模板中没有通配符。
  • 标题长度与模板差异较大。 这些都需要提前分析并通过测试用例覆盖。

学习心得:算法与工具的结合

通过本题的实现,我深刻体会到工具(如正则表达式)在解决复杂字符串处理问题中的价值。在学习算法时,结合常用的工具和库,可以大幅提升解题效率与实现质量。

对于类似问题的学习计划:

  1. 掌握正则表达式的基本语法与常用模式。
  2. 学习如何结合正则表达式与代码逻辑来解决问题。
  3. 通过多练习与实践,熟悉各种边界条件的处理方法。

希望本文能帮助你加深对通配符匹配问题的理解,并在算法学习中获得更多灵感!