本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、题目描述:
1023. 驼峰式匹配 - 力扣(LeetCode) (leetcode-cn.com)
如果我们可以将小写字母插入模式串 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
- 所有字符串都仅由大写和小写英文字母组成。
二、思路分析:
使用类似于合并有序链表的思想
使用两个指针i,j分别指向query字符串与模式字符串,在匹配的过程中i,j只向前移动,不会后退,所以算法的在一次匹配过程中算法的时间复杂度是O(m+n)
并且在匹配的过程中进行一些逻辑判断,比如i,j是否增增长,循环完成之后的一些后处理
三、AC 代码:
class Solution {
// 设定query为主串,pattern为模式串,使用pattern匹配query,但是匹配不成功的时候模式串不用回退
// 而是主串直接跳到下一个位置,直到两个串都遍历到最后的位置
// 如果模式串能够遍历完成,并且主串在模式串遍历完的位置往后的字符中没有了大小字符,就是true
public List<Boolean> camelMatch(String[] queries, String pattern) {
List<Boolean> ans = new ArrayList<>();
for(String query:queries){
ans.add(match(query,pattern));
}
return ans;
}
//虽然是双重循环遍历,但是不存在指针回退 复杂度O(m+n)
public boolean match(String query,String pattern){
int m=query.length();
int n=pattern.length();
int i=0,j=0;//主串指正和模式串指针
while(i<m&&j<n){
if(query.charAt(i)==pattern.charAt(j)){
//两个串对应的位置相等,继续匹配
i++;
j++;
}else if(query.charAt(i)!=pattern.charAt(j) && 'a'<=query.charAt(i) && query.charAt(i)<='z'){
// 两个串对应的位置不相等,并且主串上是小写字母,继续匹配
i++;
}else{
// 两个串对应的位置不相等,但是主串上大写字母,匹配失败
return false;
}
}
if(j<n){
// 模式串没有到结尾,匹配失败
return false;
}
while(i<m){
if('A'<=query.charAt(i) && query.charAt(i)<='Z'){
return false;
}
i++;
}
return true;
}
}