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

159 阅读3分钟

问题描述:

在广告平台中,为了给广告主一定的自由性和效率,允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候,会根据用户的搜索词触发的 bidword 对创意中的通配符(通配符是用成对 {} 括起来的字符串,可以包含 0 个或者多个字符)进行替换,用来提升广告投放体验。例如:“{末日血战} 上线送 SSR 英雄,三天集齐无敌阵容!”,会被替换成“帝国时代游戏下载上线送 SSR 英雄,三天集齐无敌阵容!”。给定一个含有通配符的创意和n个标题,判断这句标题是否从该创意替换生成的。

实验目的:

在广告平台中,广告主通过提交含有通配符的创意来创建广告标题。当用户搜索词触发对应的关键词时,系统会自动将创意中的通配符替换为实际关键词,形成具体的广告标题。本次实验的目的是编写一个程序,用于判断给定的标题是否由特定的含有通配符的创意替换生成。

实验步骤:

定义创意和标题:给定一个含有通配符的创意和若干标题。 通配符替换逻辑:根据通配符匹配规则,替换创意中的通配符。 判断匹配:逐个比较标题是否由创意替换生成。

算法分析:

1.构建正则表达式:

初始化一个空字符串 regex_pattern 来存储构建的正则表达式。遍历模板字符串 template,对每个字符进行处理。如果遇到 {,则跳过它,继续寻找对应的 },并将它们之间的所有字符视为通配符,用 .* 替换。如果遇到非 { 的字符,则使用 re.escape 对其进行转义,以避免正则表达式中的特殊字符被错误解释。将处理后的字符或通配符表达式追加到 regex_pattern 中。

2.匹配标题:

使用 re.compile 将 regex_pattern 编译成一个正则表达式对象 regex。遍历标题列表titles,对每个标题使用 regex.match 进行匹配。regex.match 从字符串的开始位置进行匹配,如果匹配成功则返回匹配对象,否则返回 None。将匹配结果(布尔值)存储在列表 results 中。返回结果:将results 列表中的布尔值转换为字符串,并使用逗号分隔。返回结果字符串。

3.算法复杂度

时间复杂度: 构建正则表达式:遍历模板字符串一次,时间复杂度为 O(m),其中 m 是模板字符串的长度。匹配标题:对每个标题进行正则表达式匹配,时间复杂度为 O(n * k),其中 n 是标题的数量,k 是标题的平均长度(在最坏情况下,正则表达式引擎可能需要检查整个标题字符串)。因此,总的时间复杂度为 O(m + n * k)。 空间复杂度: 存储正则表达式模式:O(m),其中 m 是模板字符串的长度(考虑到转义和通配符替换)。 存储匹配结果:O(n),其中 n 是标题的数量(每个标题的匹配结果是一个布尔值)。 因此,总的空间复杂度为 O(m + n)。

4.算法优化

该算法已经相对简洁且高效,因为它直接利用了正则表达式的强大功能来匹配模式。 如果模板字符串或标题列表非常大,或者需要频繁地进行匹配操作,可以考虑使用更高效的数据结构或算法,如构建后缀树/后缀数组来加速匹配过程(尽管这可能会增加实现的复杂性)。 在实际应用中,如果模板字符串的格式是固定的或可预测的,也可以考虑使用更简单的字符串匹配算法来替代正则表达式,以提高性能。

代码实现:

e2cbfeeacec44d2fbaff0a46aedafc6b.png