一、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;
}
}
複雜度分析
- 時間複雜度:,N 爲查詢串的總字符個數,m 爲模式串的長度
- 空間複雜度:,