如果我们可以将小写字母插入模式串 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
所有字符串都仅由大写和小写英文字母组成。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/camelcase-matching
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
定义双指针,i用来遍历query,j用来遍历pattern。
我们根据pattern的字符来匹配:
如果j指向的pattern的字符是大写字符,则移动i指针找到i之后的query的第一个大写字符,比较两个字符相等则i++,j++继续匹配,不等返回false
如果是小写字符,则移动i指针直到遇到大写字符,匹配小写字符是否相等,如果相等,则匹配成功,如果不等,则继续移动i指针直到i指向的字符是大写字符还没有匹配成功返回false。
class Solution {
String pattern;
public List<Boolean> camelMatch(String[] queries, String pattern) {
this.pattern=pattern;
List<Boolean> list=new ArrayList<>();
for(int i=0;i<queries.length;i++){
list.add(getRes(queries[i]));
}
return list;
}
public boolean getRes(String query){
int l=query.length();
int i=0;
int j=0;
while(i<l && j<pattern.length()){
int flag=0;//状态0表示匹配不成功,1表示成功
if(pattern.charAt(j)>='a' && pattern.charAt(j)<='z'){//如果是小写字符
while (query.charAt(i)>='a' && query.charAt(i)<='z'){//限制i只能指向小写字符
if(query.charAt(i)==pattern.charAt(j)){
flag=1;
break;//匹配成功跳出循环
}
i++;//移动i,i一定指向小写字符
}
if(flag==1){//当前字符匹配成功,i和j都指向下个字符继续进行匹配
i++;
j++;
}else{
return false;
}
}else{
/*加入i
while(i<l && query.charAt(i)>='a' && query.charAt(i)<='z'){
i++;
}
if(i==l){//query已经全都匹配完了,都没找到一个大写字符
return false;
}else{
if(query.charAt(i)==pattern.charAt(j)){//此时i,j均指向大写字符进行比较
flag=1;
}
if(flag==1){
i++;
j++;
}else{
return false;
}
}
}
}
//如果pattern已经匹配完了,而query还有剩余字符,判断剩余字符是否有大写
if(j==pattern.length() && i<l){
while(i<l){
if(query.charAt(i)>='A' && query.charAt(i)<='Z'){
return false;
}
i++;
}
}
return true;
}
}