leetCode1023:駝峰式匹配
技術標籤:刷題筆記
目錄
一、題目描述
如果我們可以將小寫字母插入模式串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;
}