1. 题目
2. 解题思路
- 使用正则表达式的匹配功能来解决这个问题。
- 将模板中的通配符部分转换为
**<font style="color:rgb(52, 53, 65);background-color:rgb(226, 232, 240);">.*</font>**
,表示可以匹配任意字符。 - 对模板中的非通配符字符进行转义,以确保它们在正则表达式中正确匹配。
- 使用构建的正则表达式进行全匹配检查。
- 遍历每个标题,检查其是否与正则表达式匹配。
3. 代码实现
function solution(n, template, titles) {
// 初始化正则表达式模式
let regexPattern = '';
let i = 0;
// 遍历模板字符串的每个字符
while (i < template.length) {
// 检测到通配符的开始
if (template[i] === '{') {
i++; // 跳过 '{'
// 找到通配符的结束 '}',直到找到
while (i < template.length && template[i] !== '}') {
i++;
}
// 将通配符部分转换为 '.*',表示任意字符的匹配
regexPattern += '.*';
} else {
// 转义非通配符字符,以确保在正则表达式中正确匹配
regexPattern += template[i].replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
//这个方法通常用于准备一个字符串,使其可以作为正则表达式的一部分安全地使用,而不会因为其中的特殊字符而产生意外的匹配行为
}
i++; // 继续下一个字符
}
// 使用构建的正则表达式进行全匹配
let regex = new RegExp(`^${regexPattern}$`);
// 检查每个标题是否与正则表达式匹配
let results = titles.map(title => regex.test(title) ? "True" : "False");
// 将结果数组转换为逗号分隔的字符串
let resultsStr = results.join(',');
return resultsStr; // 返回结果字符串
}
4. 收获
-
使用正则表达式:
- 理解通配符的匹配方式。
- 掌握如何进行全匹配。
- 学会转义无意义字符以避免引起意外匹配行为。
-
map
的使用 -
将数组转换为字符串
join
python 版本完整代码:
import re
def solution(n, template, titles):
# Please write your code here
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
if __name__ == "__main__":
# You can add more test cases here
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")