Given an array of strings queries
and a string pattern
, return a boolean array answer
where answer[i]
is true
if queries[i]
matches pattern
, and false
otherwise.
A query word queries[i]
matches pattern
if you can insert lowercase English letters pattern so that it equals the query. You may insert each character at any position and you may not insert any characters.
Example 1:
Input: queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FB" Output: [true,false,true,true,false] Explanation: "FooBar" can be generated like this "F" + "oo" + "B" + "ar". "FootBall" can be generated like this "F" + "oot" + "B" + "all". "FrameBuffer" can be generated like this "F" + "rame" + "B" + "uffer".
Example 2:
Input: queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBa" Output: [true,false,true,false,false] Explanation: "FooBar" can be generated like this "Fo" + "o" + "Ba" + "r". "FootBall" can be generated like this "Fo" + "ot" + "Ba" + "ll".
Example 3:
Input: queries = ["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"], pattern = "FoBaT" Output: [false,true,false,false,false] Explanation: "FooBarTest" can be generated like this "Fo" + "o" + "Ba" + "r" + "T" + "est".
Constraints:
1 <= pattern.length, queries.length <= 100
1 <= queries[i].length <= 100
queries[i]
andpattern
consist of English letters.
Solution 1: Two Pointers
We can traverse every string in queries
and check whether it matches pattern
or not. If it matches, we add true
to the answer array, otherwise we add false
.
Next, we implement a function
We can use two pointers
If the pointer false
. Otherwise, we move both pointers true
, otherwise we return false
.
Time complexity queries
and the string pattern
respectively.
class Solution:
def camelMatch(self, queries: List[str], pattern: str) -> List[bool]:
def check(s, t):
m, n = len(s), len(t)
i = j = 0
while j < n:
while i < m and s[i] != t[j] and s[i].islower():
i += 1
if i == m or s[i] != t[j]:
return False
i, j = i + 1, j + 1
while i < m and s[i].islower():
i += 1
return i == m
return [check(q, pattern) for q in queries]
class Solution {
public List<Boolean> camelMatch(String[] queries, String pattern) {
List<Boolean> ans = new ArrayList<>();
for (var q : queries) {
ans.add(check(q, pattern));
}
return ans;
}
private boolean check(String s, String t) {
int m = s.length(), n = t.length();
int i = 0, j = 0;
for (; j < n; ++i, ++j) {
while (i < m && s.charAt(i) != t.charAt(j) && Character.isLowerCase(s.charAt(i))) {
++i;
}
if (i == m || s.charAt(i) != t.charAt(j)) {
return false;
}
}
while (i < m && Character.isLowerCase(s.charAt(i))) {
++i;
}
return i == m;
}
}
class Solution {
public:
vector<bool> camelMatch(vector<string>& queries, string pattern) {
vector<bool> ans;
auto check = [](string& s, string& t) {
int m = s.size(), n = t.size();
int i = 0, j = 0;
for (; j < n; ++i, ++j) {
while (i < m && s[i] != t[j] && islower(s[i])) {
++i;
}
if (i == m || s[i] != t[j]) {
return false;
}
}
while (i < m && islower(s[i])) {
++i;
}
return i == m;
};
for (auto& q : queries) {
ans.push_back(check(q, pattern));
}
return ans;
}
};
func camelMatch(queries []string, pattern string) (ans []bool) {
check := func(s, t string) bool {
m, n := len(s), len(t)
i, j := 0, 0
for ; j < n; i, j = i+1, j+1 {
for i < m && s[i] != t[j] && (s[i] >= 'a' && s[i] <= 'z') {
i++
}
if i == m || s[i] != t[j] {
return false
}
}
for i < m && s[i] >= 'a' && s[i] <= 'z' {
i++
}
return i == m
}
for _, q := range queries {
ans = append(ans, check(q, pattern))
}
return
}
function camelMatch(queries: string[], pattern: string): boolean[] {
const check = (s: string, t: string) => {
const m = s.length;
const n = t.length;
let i = 0;
let j = 0;
for (; j < n; ++i, ++j) {
while (i < m && s[i] !== t[j] && s[i].codePointAt(0) >= 97) {
++i;
}
if (i === m || s[i] !== t[j]) {
return false;
}
}
while (i < m && s[i].codePointAt(0) >= 97) {
++i;
}
return i == m;
};
const ans: boolean[] = [];
for (const q of queries) {
ans.push(check(q, pattern));
}
return ans;
}