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

113 阅读2分钟

问题描述

在广告平台中,广告主可以通过在标题中使用通配符来创建动态广告标题。通配符是由成对的 {} 括起来的字符串,表示可以被替换成任意字符,甚至可以为空。例如,对于模板 "{abc}xyz{def}",可以生成的标题包括 xyzdefabcdefabxyzdef 等。给定一个模板和若干标题,我们需要判断每个标题是否可以通过替换模板中的通配符生成。

思路分析

要判断一个标题是否可以由模板生成,我们需要处理模板中的通配符 {},并将它们替换为能够匹配任意字符的模式。具体步骤如下:

  • 通配符替换:将模板中的 {xyz} 替换成能够匹配任意字符序列的模式。例如,{xyz} 可以替换成 .*,表示匹配零个或多个任意字符。
  • 匹配模式构建:为了确保模板匹配的是整个标题,我们需要在生成的匹配模式前加 ^,在后加 $。这样确保生成的标题与模板完全一致,而不仅仅是部分匹配。
  • 逐个匹配标题:对于每个标题,使用正则表达式来判断是否符合生成的匹配模式。如果符合,返回 True,否则返回 False

解决方案与代码实现

正则表达式的使用

利用 Python 的正则表达式库 re,我们可以将模板中的通配符 {...} 替换为匹配任意字符的 .*。这样,生成的模式可以灵活匹配任意字符序列。

代码实现

import re def solution(n, template, titles): # 将模板中的 {...}通配符替换为.` pattern = re.sub(r'{.?}', '.*', template)

# 在前后加上 `^``$` 以确保完全匹配
pattern = f"^{pattern}$"

# 判断每个标题是否匹配模板
results = []
for title in titles:
    if re.match(pattern, title):
        results.append("True")
    else:
        results.append("False")

return ",".join(results)

`

代码详解

  • 替换通配符re.sub(r'{.*?}', '.*', template) 将所有 {...} 替换为 .*,使得生成的模式可以匹配任意字符序列。

  • 添加边界:在模板的正则表达式两端添加 ^$,确保匹配的标题与模板完全一致。

  • 逐个匹配标题:使用 re.match(pattern, title) 来检查每个标题是否符合模式,并记录结果。

复杂度分析

假设模板长度为 m,每个标题长度为 k,标题数量为 n,则代码复杂度为 O(m + n * k),其中替换模板的复杂度为 O(m),匹配每个标题的复杂度为 O(k)。这种复杂度在标题数量较大时具有较好的效率。 对于模板 "a{xyz}bc{y}",正则表达式替换后为 ^a.*bc.*$

  • 标题 1"abcbc" 不匹配,因为没有在 abc 之间插入字符。
  • 标题 2"axbc" 匹配,{xyz} 可以匹配 x
  • 标题 3"axbcdef" 不匹配,因为包含额外的字符 def。 通过一些示例来理解这个算法的应用:

示例 1

  • 输入:template = "a{bdc}efg"titles = ["abcdefg", "abefg", "efg"]
  • 输出:True, True, False

解释:模板 a{bdc}efg 可以生成 "abcdefg""abefg",但不能生成 "efg"

示例 2

  • 输入:template = "{abc}xyz{def}"titles = ["xyzdef", "abcdef", "abxyzdef", "xyz", "abxyz"]
  • 输出:True, False, True, True, True

解释:模板 {abc}xyz{def} 可以生成 "xyzdef""abxyzdef""xyz""abxyz",但不能生成 "abcdef"

总结

本文通过对广告标题通配符模板的分析,详细阐述了如何判断标题是否符合模板生成。通过使用正则表达式替换 {...}.*,我们可以将问题转化为匹配问题。将生成的模式用于匹配每个标题,得出标题是否符合模板。这种方法不仅简单高效,而且能够处理各种长度的通配符匹配。