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

0 阅读2分钟

1. 题目

2. 解题思路

  1. 使用正则表达式的匹配功能来解决这个问题。
  2. 将模板中的通配符部分转换为 **<font style="color:rgb(52, 53, 65);background-color:rgb(226, 232, 240);">.*</font>**,表示可以匹配任意字符。
  3. 对模板中的非通配符字符进行转义,以确保它们在正则表达式中正确匹配。
  4. 使用构建的正则表达式进行全匹配检查。
  5. 遍历每个标题,检查其是否与正则表达式匹配。

3. 代码实现

function solution(n, template, titles) {
  // 初始化正则表达式模式
  let regexPattern = '';
  let i = 0;

  // 遍历模板字符串的每个字符
  while (i < template.length) {
    // 检测到通配符的开始
    if (template[i] === '{') {
      i++; // 跳过 '{'
      // 找到通配符的结束 '}',直到找到
      while (i < template.length && template[i] !== '}') {
        i++;
      }
      // 将通配符部分转换为 '.*',表示任意字符的匹配
      regexPattern += '.*';
    } else {
      // 转义非通配符字符,以确保在正则表达式中正确匹配
      regexPattern += template[i].replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
      //这个方法通常用于准备一个字符串,使其可以作为正则表达式的一部分安全地使用,而不会因为其中的特殊字符而产生意外的匹配行为
    }
    i++; // 继续下一个字符
  }

  // 使用构建的正则表达式进行全匹配
  let regex = new RegExp(`^${regexPattern}$`);
  // 检查每个标题是否与正则表达式匹配
  let results = titles.map(title => regex.test(title) ? "True" : "False");

  // 将结果数组转换为逗号分隔的字符串
  let resultsStr = results.join(',');

  return resultsStr; // 返回结果字符串
}

4. 收获

  1. 使用正则表达式:

    • 理解通配符的匹配方式。
    • 掌握如何进行全匹配。
    • 学会转义无意义字符以避免引起意外匹配行为。
  2. map 的使用

  3. 将数组转换为字符串 join

python 版本完整代码:

    
import re
 
def solution(n, template, titles):
    # Please write your code here
    regex_pattern = ''
    i = 0
    while i < len(template):
        if template[i] == '{':
            # 找到通配符开始
            i += 1
            while i < len(template) and template[i] != '}':
                i += 1
            # 包含通配符,转换为 .*
            regex_pattern += '.*'
        else:
            regex_pattern += re.escape(template[i])  # 转义非通配符字符
        i += 1
 
    # 使用正则表达式进行匹配
    regex = re.compile(f'^{regex_pattern}$')  # 全匹配
    results = [bool(regex.match(title)) for title in titles]
 
    # 将 results 列表转换为逗号分隔的字符串
    results_str = ','.join(map(str, results))
    
    return results_str
 
if __name__ == "__main__":
    #  You can add more test cases here
    testTitles1 = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]
    testTitles2 = ["CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"]
    testTitles3 = ["abcdefg", "abefg", "efg"]
 
    print(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1) == "True,False,False,True")
    print(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2) == "False,False,False,False,False,True")
    print(solution(3, "a{bdc}efg", testTitles3) == "True,True,False")