#leetcode刷题之路44-通配符匹配

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:
输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:
s = "aa"
p = "*"
输出: true
解释: '*' 可以匹配任意字符串。
示例 3:
输入:
s = "cb"
p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

 

思路1:

这是我第一反应的做法,就是用两个指针按顺序遍历。因为遇到‘?’时和两个字符相等是一样的操作,所以这道题主要是讨论遇到‘*’时的操作,这时需要加入一些辅助指针。

所有定义的指针为:ss(指向当前位置或pp遇到‘*’的位置)//// pp(指向一个普通位置或当前最后一个‘*’之后的位置) ////sstar (用于跳过s串中的字符)//// pstar(固定指向当前遇到的最后一个*)

#include <iostream>
using namespace std;

bool isMatch(string s, string p) {
    char*ss=(char*)s.data();
    char*pp=(char*)p.data();
    char*sstar= nullptr;
    char*pstar= nullptr;
    while(*ss)
    {
        if(*ss==*pp||*pp=='?')
        {
            ss++;
            pp++;
        }
        else if(*pp=='*')
        {
            pstar=pp++;
            sstar=ss;
        }
        else if(pstar)
        {
            pp=pstar+1;
            ss=++sstar;
        }
        else return false;
    }
    while(*pp == '*') ++pp;
    return !*pp;
}
int main() {
    string s="aaaa";
    string p="***a";
    std::cout <<isMatch(s,p) << std::endl;
    return 0;
}

 

思路二:

动态规划法(https://www.cnblogs.com/daleyzou/p/9535134.html):

bool isMatch(string s, string p) {
    bool **dp=new bool *[s.length()+1];//s.length()+1个bool*类型的一维指针
    for(int i=0;i<s.length()+1;i++)
    {
        dp[i]=new bool[p.length()+1];
        memset(dp[i],0,(p.length()+1)*sizeof(bool));
    }
    dp[0][0]= true;
    for(int i=0;i<p.length();i++)
    {
        if(dp[0][i]&&p[i]=='*')
            dp[0][i+1]=true;
    }

    for (int i = 0; i < s.length(); i++){
        for (int j = 0; j < p.length(); j++){
            if (p[j] == '*'){
                dp[i + 1][j + 1] = dp[i][j+1] || dp[i+1][j];
            }else if (p[j] == '?' || s[i] == p[j]){
                dp[i + 1][j + 1] = dp[i][j];
            }
        }
    }
    return dp[s.length()][p.length()];
}

 

posted @ 2019-04-05 23:05  maitianpt  阅读(341)  评论(0编辑  收藏  举报