leetcode-wildcard match

来源:互联网 发布:2017淘宝追加评论期限 编辑:程序博客网 时间:2024/04/29 23:54

递归(Time Limited),便于理解

class Solution {public:    bool isMatch(string s, string p) {        if (p.empty()) return s.empty();//同空为真        if (p[0]!='*'){            if (s[0]==p[0]||(p[0]=='?'&&!s.empty())) return isMatch(s.substr(1),p.substr(1));            else return false;        }        else{            if (isMatch(s,p.substr(1))) return true;            if (!s.empty()) return isMatch(s.substr(1),p);            else return false;        }    }};

非递归
(借鉴solution置顶算法)

class Solution {public:    bool isMatch(string s, string p) {//通配符匹配        int m=s.size(),n=p.size(),index=-1,ss=0,i=0,j=0;        bool flag=false;        if (p.empty()) return s.empty();        vector<vector<bool>> f(m+1,vector<bool>(n+1,false));        f[0][0]=true;        for (i=0,j=0;i<m;){            //cout<<i<<" "<<j<<" "<<index<<endl;            switch(p[j]){                case '?':                    i++;j++;                    break;                case '*'://记录下此时*的位置,便于回溯(index)                    ss=i;//目标串此时位置                    while(p[j]=='*'&&j<n) j++;                    index=j-1;                    break;                default:                    //cout<<p[j]<<" ";                    if (s[i]!=p[j]){                        if (index==-1) return false;                        j=index+1;                        ss++;                        i=ss;                    }                    else {                        i++;j++;                    }                    break;            }        }        //cout<<j<<endl;        while(p[j]=='*'&&j<n) j++;        //cout<<j;        return j==n;    }};
0 0