leetcode No44. Wildcard Matching

Question

Implement wildcard pattern matching with support for ‘?’ and ‘*’.

‘?’ Matches any single character.
‘*’ Matches any sequence of characters (including the empty sequence).

The matching should cover the entire input string (not partial).

The function prototype should be:
bool isMatch(const char *s, const char *p)

Some examples:
isMatch(“aa”,”a”) → false
isMatch(“aa”,”aa”) → true
isMatch(“aaa”,”aa”) → false
isMatch(“aa”, “*”) → true
isMatch(“aa”, “a*”) → true
isMatch(“ab”, “?*”) → true
isMatch(“aab”, “c*a*b”) → false

题目大意是:?可以匹配一个字符,*可以匹配多个字符

Algorithm

网上看到的方法:
http://www.cnblogs.com/felixfang/p/3708999.html
摘抄重要的一部分:
以 p = “c*ab*c”,s = “cddabbac”为例。

对于p = “c*ab*c”,我们可以猜想出它可以匹配的s应该长成这样: “c….ab…..c”,省略号表示0到任意多的字符。我们发现主要就是p的中间那个”ab”比较麻烦,一定要s中的’ab’来匹配,因此只要s中间存在一个”ab”,那么一切都可以交给后面的’*’了。

所以说,当我们挨个比较p和s上的字符时,当我们遇到p的第一个’*’,我们实际只需要不断地在s的剩余部分找和’ab’匹配的部分。

换言之,我们可以记录下遇到时p和s的位置,记为presp和press,然后挨个继续比较(++p)和(++s);如果发现*p != *s,就回溯回去,p = presp,s = press+1, ++press;直到比较到末尾,或者遇到了下一个’‘,如果遇到了下一个’‘,说明 “ab”部分搞定了,下面的就交给第二个’‘了;如果p和s都到末尾了,那么就返回true;如果到末尾了既没遇到新的’*’,又还存在不匹配的值,press也已经到末尾了,那么就返回false了。

遇到星号,我们只考虑遇到下一个星号前的子问题,而不是考虑一直到末尾的子问题。从而避免大量的子问题计算。

我们通过记录 prep和pres(初始值为-1),每次回溯的方法,避免使用递归。i,j记录当前遍历s,p的下标。
1、遇到s[i]==p[j]或p[j]==’?’,i++,j++
2、遇到p[j]==星号时,prep记录星号j的下一个元素,pres记录当前i(通配符匹配的起始位置)j++
3、遇到不相等,prep!=-1(说明之前有星号了), i=(++pres);j=prep;
4、否则返回false

while循环后,还要判断p后面的字符是否都是星号

Accepted Code

class Solution {
public:
    bool isMatch(string s, string p) {
        int i=0,j=0;
        int pres=-1,prep=-1;
        while(i<s.size()){
            if(j<p.size() && (s[i]==p[j] || p[j]=='?')){
                i++;
                j++;
            }
            else if(j<p.size() && p[j]=='*'){
                pres=i;
                prep=++j;
            }
            else if(prep!=-1){
                i=(++pres);
                j=prep;
            }
            else
                return false;
        }
        while(j<p.size() && p[j]=='*')
            j++;
        return j==p.size();
    }
};
基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值