【雙指針】B022_LC_駝峯式匹配(分類討論)

一、Problem

如果我們可以將小寫字母插入模式串 pattern 得到待查詢項 query,那麼待查詢項與給定模式串匹配。(我們可以在任何位置插入每個字符,也可以插入 0 個字符。)

給定待查詢列表 queries,和模式串 pattern,返回由布爾值組成的答案列表 answer。只有在待查項 queries[i] 與模式串 pattern 匹配時, answer[i] 才爲 true,否則爲 false。

輸入: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
所有字符串都僅由大寫和小寫英文字母組成。

二、Solution

方法一:雙指針

思路

我們遍歷兩個串時,會有以下幾種情況:

  • q[i] = p[j] 時,證明兩個串都是大寫字母的開頭
  • q[i] != p[j] 時,如果 q[i] 是小寫,那麼當沒事發生;如果 q[i] 是大寫,這種情況就是不匹配

當遍歷完畢後(兩個串之一遍歷完),如果是模式串 p 沒有遍歷完,證明不匹配;而如果查詢串 q 還有大寫字母證明也不匹配

class Solution {
    boolean isMatch(char[] q, char[] p) {
        int i = 0, j = 0, n = q.length, m = p.length;
        while (i < n && j < m) {
            if (q[i] == p[j]) {
                i++; j++;
            } else {
                if ('A' <= q[i] && q[i] <= 'Z')
                    return false;
                i++;
            }
        }
        if (j != m)
            return false;
        while (i < n) {
            if ('A' <= q[i] && q[i] <= 'Z')
                return false;
            i++;
        }
        return true;
    }
    public List<Boolean> camelMatch(String[] qs, String pattern) {
        List<Boolean> ans = new LinkedList<>();
        char[] p = pattern.toCharArray();
        for (String q : qs) {
            ans.add(isMatch(q.toCharArray(), p)); 
        }
        return ans;
    }
}

複雜度分析

  • 時間複雜度:O(N×m)O(N × m),N 爲查詢串的總字符個數,m 爲模式串的長度
  • 空間複雜度:O(n)O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章