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

39 阅读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", "xyz", "abxyz"]
输出:"True,False,True,True,True"

def solution(n, template, titles):
    # Please write your code here
    length = len(template)
    key = template[length-1]
    def compare(template, title):

        if not template and not title:
            return True
        if not template:
            if key == '}':
                return True
            else:
                return False
        if not title:
            if template[0] == '{' and template[len(template)-1] == '}':
                return True
            else:
                return False

        if template[0] == '{':
            brace = template.index('}')
            for i in range(len(title) + 1):
                if compare(template[brace + 1:], title[i:]):
                    return True
            return False
        
        if template[0] != title[0]:
            return False
        if template[0] == title[0]:
            return compare(template[1:], title[1:])

    results = []
    for title in titles:
        results.append(str(compare(template, title)))
        # print(results)
    results = ','.join(results)    
    print(results)
    return results

代码思路解释

  1. 函数定义

    • solution(n, template, titles):这是主函数,负责处理输入的 n 个标题,并返回一个字符串,表示每个标题是否符合模板。
  2. 辅助函数 compare

    • compare(template, title):这是一个递归函数,用于比较 templatetitle 是否匹配。
  3. 初始化

    • length = len(template):计算模板的长度。
    • key = template[length-1]:获取模板的最后一个字符,并将其存储在 key 变量中。
  4. 递归比较逻辑

    • 边界条件
      • 如果 templatetitle 都为空,返回 True
      • 如果 template 为空,检查 key 是否为 },如果是则返回 True,否则返回 False
      • 如果 title 为空,检查 template 是否以 { 开头并以 } 结尾,如果是则返回 True,否则返回 False
    • 处理通配符
      • 如果 template 的第一个字符是 {,找到对应的 },并尝试匹配通配符部分。
      • 使用 template.index('}') 找到通配符的结束位置,然后递归比较剩余部分。
    • 字符匹配
      • 如果 template 的第一个字符和 title 的第一个字符匹配,继续递归比较剩余部分。
      • 如果不匹配,返回 False
  5. 结果收集

    • 遍历 titles,对每个标题调用 compare 函数,并将结果存储在 results 列表中。
    • 最后将 results 列表转换为逗号分隔的字符串并返回。