Keshawn_lu's Blog

Leetcode 1023. 驼峰式匹配

字数统计: 569阅读时长: 2 min
2023/04/14 Share

题目简介:

如果我们可以将小写字母插入模式串 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. 1 <= queries.length <= 100
  2. 1 <= queries[i].length <= 100
  3. 1 <= pattern.length <= 100
  4. 所有字符串都仅由大写和小写英文字母组成。

思路:

双指针,分为以下几种情况:

  • s[i] == pattern[idx],则继续往下匹配
  • s[i] != pattern[idx]
    • s[i]为小写字母,则跳过此字母,继续往下遍历
    • s[i]为大写字母,则跳出此次循环,去寻找新的s[new_i] == pattern[idx]

idx == pattern.size()时,说明匹配完成,则观察s剩余的字母是否都为小写字母:

  • 若是,则返回true
  • 若不是,则返回false

当寻找新的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;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: