目录
一、题目描述
如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)
给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false。
示例 1:
输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FB"
输出:[true,false,true,true,false]
示例:
"FooBar" 可以这样生成:"F" + "oo" + "B" + "ar"。
"FootBall" 可以这样生成:"F" + "oot" + "B" + "all".
"FrameBuffer" 可以这样生成:"F" + "rame" + "B" + "uffer".
示例 2:
输入:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBa"
输出:[true,false,true,false,false]
解释:
"FooBar" 可以这样生成:"Fo" + "o" + "Ba" + "r".
"FootBall" 可以这样生成:"Fo" + "ot" + "Ba" + "ll".
示例 3:
输出:queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBaT"
输入:[false,true,false,false,false]
解释:
"FooBarTest" 可以这样生成:"Fo" + "o" + "Ba" + "r" + "T" + "est".
提示:
- 1 <= queries.length <= 100
- 1 <= queries[i].length <= 100
- 1 <= pattern.length <= 100
- 所有字符串都仅由大写和小写英文字母组成。
二、解题思路
这道题如果用字典树来做,当然可以做,但就我个人而言,感觉有点不划算。代码量不比双指针少,主要是只有一个pattern串,直接用指针操作这个串就行了。如果pattern是个string数组的话,使用字典树可能会好一些。
双指针遍历解法:
1. 分别使用指针q和p指向queries中当前遍历字符串queries[i]和pattern串的开头;
2. 如果queries[i][q] == pattern[p],则两个指针都++;
3. 如果queries[i][q] != pattern[p]且queries[i][q]为小写字符,则只有q++,因为小写字母可以随意插入;
4. 如果queries[i][q] != pattern[p]且queries[i][q]为大写字符,则不匹配,返回false;
5. 注意若pattern已经遍历完成,但是queries[i]还没有结束,且后续字符全为小写,则返回true;否则返回false。
三、代码实现
#include <bits/stdc++.h>
using namespace std;
vector<bool> camelMatch(vector<string>& queries, string pattern) {
int n = queries.size();
vector<bool> res(n);
for (int i = 0; i < n; i++) {
int q = 0, p = 0;
while (p < pattern.size()) {
//两个字符相等,都往后走
//不想等,但是query是小写的话,query往后走,pattern不动
//query是大写,直接返回
if (queries[i][q] == pattern[p]) {
q++;
p++;
} else if (islower(queries[i][q])) {
q++;
} else {
break;
}
}
//如果query串还有字符并且为小写,则继续往后走
while (q < queries[i].size() && islower(queries[i][q])) {
q++;
}
//必须两个字符串都走到结尾,才为true
res[i] = (q == queries[i].size() && p == pattern.size());
}
return res;
}
int main() {
vector<string> queries = {"FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"};
string pattern = "FoBaT";
vector<bool> res = camelMatch(queries, pattern);
for (auto&& i : res) {
cout << i << " ";
}
return 0;
}