题目简介:
如果我们可以将小写字母插入模式串 pattern
得到待查询项 query
,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)
给定待查询列表 queries
,和模式串 pattern
,返回由布尔值组成的答案列表 answer
。只有在待查项 queries[i]
与模式串 pattern
匹配时, answer[i]
才为 true
,否则为 false
。
示例 1:
1 2 3 4 5 6 7
| 输入: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".
|
提示:
1 <= queries.length <= 100
1 <= queries[i].length <= 100
1 <= pattern.length <= 100
- 所有字符串都仅由大写和小写英文字母组成。
思路:
双指针,分为以下几种情况:
s[i] == pattern[idx]
,则继续往下匹配
s[i] != pattern[idx]
:
- 若
s[i]
为小写字母,则跳过此字母,继续往下遍历
- 若
s[i]
为大写字母,则跳出此次循环,去寻找新的s[new_i] == pattern[idx]
当idx == pattern.size()
时,说明匹配完成,则观察s
剩余的字母是否都为小写字母:
当寻找新的s[new_i] == pattern[idx]
时,需要观察pattern[idx]
是否为小写字母,若为大写字母,则不可能匹配成功,直接返回false
。否则,寻找下一个new_i
。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| class Solution { public:
bool solve(string& s, string& pattern){
int idx = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == pattern[idx]){
int temp = idx; int temp_i = i;
idx++; i++; while(i < s.size()){
if(s[i] == pattern[idx]){
idx++; i++; } else{
if(isupper(s[i])) break; else i++; }
if(idx == pattern.size()){
while(i < s.size()){
i++; if(isupper(s[i])) return false; }
return true; } }
idx = temp;
if(isupper(pattern[idx])) return false;
i = s.find(pattern[idx], temp_i + 1) - 1; } }
return (idx == pattern.size()); }
vector<bool> camelMatch(vector<string>& queries, string pattern) {
vector<bool> res;
for(auto& s : queries){
res.push_back(solve(s, pattern)); }
return res; } };
|