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

69 阅读3分钟

整体思路

判断给定的多个标题是否是由一个含有通配符的创意模板通过替换通配符生成的。其核心思路是将含有通配符的创意模板转换为正则表达式,然后利用正则表达式匹配来逐一判断每个标题是否符合由该模板生成的条件,最后将判断结果组合成字符串返回。

代码细节分析

  1. convertTemplateToRegex 方法:将创意模板转换为正则表达式

    • 首先创建了一个 StringBuilder 对象 regex,用于逐步构建正则表达式。同时获取创意模板 template 的长度,以便后续遍历使用。

    • 通过循环遍历创意模板中的每个字符:

      • 当遇到字符 { 时:
        • 意味着遇到了通配符的开始部分。接下来通过 template.indexOf('}', i) 查找与之对应的闭合 } 的索引位置。如果找到了闭合 }(即 endIndex 不为 -1),则在正则表达式 regex 中添加 [a-zA-Z]*,这表示可以匹配任意数量的英文字母,也就是对应通配符可以包含任意英文字符的含义。然后将循环索引 i 更新为 endIndex,直接跳过当前通配符部分,继续处理后面的字符。
      • 当遇到的字符不是 { 时:
        • 直接将该字符添加到正在构建的正则表达式 regex 中,因为这些普通字符在标题中必须严格匹配。
    • 循环结束后,将构建好的正则表达式以字符串形式返回,通过 return regex.toString();

  2. solution 方法:判断标题是否由创意模板生成

    • 首先创建一个 StringBuilder 对象 sb,用于构建最终要返回的结果字符串,这个字符串将包含对每个标题判断结果的拼接。

    • 调用 convertTemplateToRegex 方法将给定的创意模板 template_ 转换为正则表达式,并将结果存储在 regex 中。

    • 通过循环遍历给定的标题数组 titles 中的每个标题:

      • 对于每个标题 title,使用 Pattern.matches(regex, title) 来判断该标题是否匹配由创意模板转换而来的正则表达式 regex。这里 Pattern.matches 方法会返回一个布尔值,表示是否匹配成功。
      • 根据匹配结果,通过 sb.append(isMatch? "True" : "False").append(","); 将判断结果("True" 或 "False")添加到 sb 中,并在后面添加一个逗号,用于分隔不同标题的判断结果。
    • 在循环遍历完所有标题后,检查 sb 的长度,如果大于 0,说明已经添加了至少一个标题的判断结果,此时通过 sb.setLength(sb.length() - 1); 将最后添加的逗号去掉,因为最后一个标题判断结果后面不需要逗号。

    • 最后,将构建好的结果字符串通过 return sb.toString(); 返回,这个字符串就是对每个标题是否由创意模板生成的判断结果的组合,格式如 "True,False,False,True" 等。

    private static String convertTemplateToRegex(String template) {
        StringBuilder regex = new StringBuilder();
        int length = template.length();

        for (int i = 0; i < length; i++) {
            char ch = template.charAt(i);
            if (ch == '{') {
                // Find the closing '}'
                int endIndex = template.indexOf('}', i);
                if (endIndex != -1) {
                    // Add the pattern to match any characters between {}
                    regex.append("[a-zA-Z]*");
                    i = endIndex; // Skip to the end of the {}
                }
            } else {
                regex.append(ch);
            }
        }

        return regex.toString();
    }
    public static String solution(int n, String template_, String[] titles) {
        // Please write your code here
        StringBuilder sb = new StringBuilder();
        String regex = convertTemplateToRegex(template_);
        for (String title : titles) {
            boolean isMatch = Pattern.matches(regex, title);
            sb.append(isMatch ? "True" : "False").append(",");
        }
        if (sb.length() > 0) {
            sb.setLength(sb.length() - 1);
        }
        return sb.toString();
    }