问题描述
在广告平台中,广告主可以通过在标题中使用通配符来创建动态广告标题。通配符是由成对的 {} 括起来的字符串,表示可以被替换成任意字符,甚至可以为空。例如,对于模板 "{abc}xyz{def}",可以生成的标题包括 xyzdef、abcdef、abxyzdef 等。给定一个模板和若干标题,我们需要判断每个标题是否可以通过替换模板中的通配符生成。
思路分析
要判断一个标题是否可以由模板生成,我们需要处理模板中的通配符 {},并将它们替换为能够匹配任意字符的模式。具体步骤如下:
- 通配符替换:将模板中的
{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"不匹配,因为没有在a和bc之间插入字符。 - 标题 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"。
总结
本文通过对广告标题通配符模板的分析,详细阐述了如何判断标题是否符合模板生成。通过使用正则表达式替换 {...} 为 .*,我们可以将问题转化为匹配问题。将生成的模式用于匹配每个标题,得出标题是否符合模板。这种方法不仅简单高效,而且能够处理各种长度的通配符匹配。