leetCode1023:驼峰式匹配

目录

一、题目描述

二、解题思路

三、代码实现


一、题目描述

如果我们可以将小写字母插入模式串 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
  • 所有字符串都仅由大写和小写英文字母组成。

二、解题思路

这道题如果用字典树来做,当然可以做,但就我个人而言,感觉有点不划算。代码量不比双指针少,主要是只有一个pattern串,直接用指针操作这个串就行了。如果pattern是个string数组的话,使用字典树可能会好一些。

双指针遍历解法:

1. 分别使用指针q和p指向queries中当前遍历字符串queries[i]和pattern串的开头;

2. 如果queries[i][q] == pattern[p],则两个指针都++;

3. 如果queries[i][q] != pattern[p]且queries[i][q]为小写字符,则只有q++,因为小写字母可以随意插入;

4. 如果queries[i][q] != pattern[p]且queries[i][q]为大写字符,则不匹配,返回false;

5. 注意若pattern已经遍历完成,但是queries[i]还没有结束,且后续字符全为小写,则返回true;否则返回false。

三、代码实现

#include <bits/stdc++.h>
using namespace std;

vector<bool> camelMatch(vector<string>& queries, string pattern) {
    int n = queries.size();
    vector<bool> res(n);
    for (int i = 0; i < n; i++) {
        int q = 0, p = 0;
        while (p < pattern.size()) {
            //两个字符相等,都往后走
            //不想等,但是query是小写的话,query往后走,pattern不动
            //query是大写,直接返回
            if (queries[i][q] == pattern[p]) {
                q++;
                p++;
            } else if (islower(queries[i][q])) {
                q++;
            } else {
                break;
            }
        }
        //如果query串还有字符并且为小写,则继续往后走
        while (q < queries[i].size() && islower(queries[i][q])) {
            q++;
        }
        //必须两个字符串都走到结尾,才为true
        res[i] = (q == queries[i].size() && p == pattern.size());
    }
    return res;
}

int main() {
    vector<string> queries = {"FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"};
    string pattern = "FoBaT";
    vector<bool> res = camelMatch(queries, pattern);
    for (auto&& i : res) {
        cout << i << " ";
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值