驼峰式匹配

题目描述

如果我们可以将小写字母插入模式串 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{
            /*加入iwhile(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;
    }
}

你可能感兴趣的:(leetcode每日一题,算法,java)