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

198 阅读4分钟

分析与解读:广告平台中的创意标题匹配问题

在广告平台中,广告主常常需要在创意标题中使用通配符来增加灵活性和自定义性,提升广告效果。给定一个带有通配符的创意模板和一组实际标题,目标是判断这些标题是否能从该模板中通过替换通配符生成。本文将对这个问题的解决方案进行详细分析,解释关键步骤,并进一步探讨如何通过正则表达式实现高效的匹配。

问题背景

在广告平台中,广告主可能会使用含有通配符({})的创意模板来定义广告标题。这些通配符允许广告主在发布广告时提供一定的灵活性。例如,广告主可以定义类似于以下格式的标题:

Copy Code
{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!

其中,{末日血战} 作为一个通配符,它可以被任何字符串替代,例如:帝国时代游戏下载,最终生成的标题为:

Copy Code
帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!

我们的任务是给定一个创意模板和一组标题,判断这些标题是否可以通过替换模板中的通配符部分生成。每个标题的生成遵循模板规则,即模板中的通配符可以被任意字符替代。

问题解析

问题的关键在于如何处理模板中的通配符部分 {},并将其转换为正则表达式,进而判断各个标题是否符合模板的结构。

解题思路

  1. 模板的转换: 模板中的通配符 {} 部分代表可以匹配任意字符(包括零个字符)。我们需要将这些通配符转换为正则表达式中的 .*,表示匹配任意长度的字符序列。

    例如,模板:

    Copy Code
    ad{xyz}cdc{y}f{x}e
    

    将被转换成正则表达式:

    Copy Code
    ad.*cdc.*f.*e
    

    这样,正则表达式中的 .* 就能匹配模板中对应通配符的部分。

  2. 正则表达式的构建

    • 我们通过遍历模板字符串,识别 {} 中的通配符,将它们替换为 .*
    • 对于非通配符部分,我们使用 re.escape() 转义这些字符,使其在正则表达式中有特殊意义。

    最终生成的正则表达式用于与标题进行匹配。

  3. 全匹配: 我们使用 ^$ 符号确保正则表达式进行的是“全匹配”,即整个标题必须完全符合模板的规则。

  4. 结果输出: 对每个标题使用正则表达式进行匹配,返回每个标题是否匹配的结果,并将结果按逗号分隔输出。

代码实现

pythonCopy Code
import re

def solution(n, template, titles):
    # 生成正则表达式模式
    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

# 测试用例
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")

代码解读

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

    • 我们遍历模板字符串,检测每个字符。如果遇到 {,则表示开始一个通配符部分,直到遇到 },将这一部分替换为 .*
    • 对于普通字符,我们使用 re.escape() 进行转义,以防止正则表达式中的特殊字符干扰匹配。
  2. 正则表达式匹配

    • 使用 re.compile(f'^{regex_pattern}$') 生成一个正则表达式对象,确保整个标题与模板完全匹配。
    • 对每个标题,我们使用 regex.match(title) 进行匹配,返回布尔值(True 或 False)。
  3. 输出格式

    • 最后将结果通过逗号连接成字符串形式,符合题目要求。

测试与验证

我们可以通过几个测试用例验证实现是否正确:

测试用例 1

输入:

pythonCopy Code
testTitles1 = ["adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"]
solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1)

输出:

Copy Code
"True,False,False,True"

这个输出表示,第一个和第四个标题与模板匹配,第二个和第三个标题不匹配。

测试用例 2

输入:

pythonCopy Code
testTitles2 = ["CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"]
solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2)

输出:

Copy Code
"False,False,False,False,False,True"

测试用例 3

输入:

pythonCopy Code
testTitles3 = ["abcdefg", "abefg", "efg"]
solution(3, "a{bdc}efg", testTitles3)

输出:

Copy Code
"True,True,False"

总结

本文介绍了如何解决广告平台中创意标题的匹配问题。通过使用正则表达式,我们可以灵活地处理带有通配符的模板并匹配给定的标题。关键在于如何将模板中的通配符 {} 转换为正则表达式中的 .*,并确保整个标题与模板完全匹配。该方法不仅简单高效,而且能够处理各种复杂的通配符形式。