A query word matches a given pattern
if we can insert lowercase letters to the pattern word so that it equals the query
. (We may insert each character at any position, and may insert 0 characters.)
Given a list of queries
, and a pattern
, return an answer
list of booleans, where answer[i]
is true if and only if queries[i]
matches the pattern
.
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".
Note:
1 <= queries.length <= 100
1 <= queries[i].length <= 100
1 <= pattern.length <= 100
- All strings consists only of lower and upper case English letters.
驼峰式匹配。
如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)
给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/camelcase-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路是双指针,类似找字符串子序列的感觉。对于 input 数组里面的每一个单词 q,我们需要跟 pattern 进行对照。对照的方式是双指针。这里我使用了一个 flag 来记录到底是 true 还是 false。false的条件请参见代码注释。
时间O(mn) - m个单词,平均长度n
空间O(m) - output list
Java实现
1 class Solution { 2 public List<Boolean> camelMatch(String[] queries, String pattern) { 3 List<Boolean> res = new ArrayList<>(); 4 for (String q : queries) { 5 int i = 0; 6 int j = 0; 7 boolean flag = true; 8 while (i < q.length() && j < pattern.length()) { 9 // 当前单词中有大写字母但是pattern里没有 10 if (q.charAt(i) >= 'A' && q.charAt(i) <= 'Z') { 11 if (q.charAt(i) != pattern.charAt(j)) { 12 flag = false; 13 } 14 } 15 if (q.charAt(i) == pattern.charAt(j)) { 16 j++; 17 } 18 i++; 19 } 20 // pattern没走完,false 21 if (j != pattern.length()) { 22 flag = false; 23 } 24 // 当前单词没走完,有大写字母,false 25 while (i < q.length()) { 26 if (q.charAt(i) >= 'A' && q.charAt(i) <= 'Z') { 27 flag = false; 28 break; 29 } 30 i++; 31 } 32 res.add(flag); 33 } 34 return res; 35 } 36 }