1. 程式人生 > 其它 >leetCode1023:駝峰式匹配

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;
}