【刷题打卡】1023. 驼峰式匹配

118 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、题目描述:

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;

    }
}