夯实算法-驼峰式匹配

165 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情

题目:LeetCode

如果我们可以将小写字母插入模式串 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. 1 <= queries.length <= 100
  2. 1 <= queries[i].length <= 100
  3. 1 <= pattern.length <= 100
  4. 所有字符串都仅由大写和小写英文字母组成。

解题思路

由题意分析知:就是在queries字符串中寻找pattern子序列,如果能匹配则其余值不含有大写字母,则匹配成功,否则匹配失败 失败的形式:

  1. str中含有其他大写字母
  2. str中没有匹配pattern 可以知道,当str长度小于pattern时,一定匹配失败, 当str长度大于等于pattern时,可以用双指针从左向右寻找匹配的字符,如果字符不匹配且str当前字符为大写字母,则匹配失败 最后判断str是否能完全匹配pattern

代码实现

public List < Boolean > camelMatch(String[] queries, String pattern) {
    List < Boolean > res = new ArrayList < Boolean > ();
    char[] pn = pattern.toCharArray();
    int len = pn.length;
    for (int i = 0; i < queries.length; i++) {
        String str = queries[i];
        if (str.length() < len) {
            res.add(false);
            continue;
        } else {
            char[] chars = str.toCharArray();
            int inx = 0;
            boolean flag = false;
            for (int j = 0; j < chars.length; j++) {
                if (inx < len && chars[j] == pn[inx]) {
                    inx++;
                    continue;
                }
                if (chars[j] < 'a') {
                    flag = true;
                    break;
                }
            }
            if (flag || inx != len) {
                res.add(false);
            } else {
                res.add(true);
            }
        }
    }
    return res;
}

运行结果

Snipaste_2023-03-05_23-06-16.png

复杂度分析

  • 空间复杂度:O(n)O(n)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!