[leetcode[ 【字符串】 44. Wildcard Matching

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

 

题意

实现?和*的通配符模式匹配

?可以替换任意单字符

*可以匹配任意字符序列,包括空序列

通配符正好可以匹配输入字符串

题解

难度在于*可以匹配一段字符串,所以如果p中包含有*,则做一个标记,把s中与p的*后面的字符不匹配的过滤掉


所以根据*p分三种情况:     *p是?时   s和p都接着往下遍历

*p是*时,做一个标记,表示*p前有*;     同时记录*的位置和当前s的位置

*p是其他字符时,如果前边没有*并且当前字符不匹配,则返回错误 ;   如果前边有*,p要筛选s(筛选的过程是这样,*后面的字符与s的进行逐一匹配,如果匹配失败,则过滤掉一个s)

class Solution {
public:
    bool isMatch(string s, string p) {
        bool start=false;
        const char *scur,*pcur,*ss,*pp;
        for(scur=&s[0],pcur=&p[0];*scur!='\0';scur++,pcur++)
        {
            switch(*pcur)
            {
                case '?':
                    break;
                case '*':
                    start=true;
                    ss=scur;
                    pp=pcur;
                    while(*pp=='*') pp++;//连续的*是一样的效果
                    if(*pp=='\0') return true;
                    scur=ss-1;//相当于下一轮s的位置不变
                    pcur=pp-1;//把下一轮的p置于*的后面
                    break;
                default :
                    if(*pcur!=*scur)
                    {
                        if(!start) return false;
                        ss++;
                        scur=ss-1;//s往前遍历,p保持在*后面
                        pcur=pp-1;
                    }
                    break;
            }
         }
         while(*pcur=='*') pcur++;
         return *pcur=='\0';
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值