10. Regular Expression Matching

来源:互联网 发布:怎么看待网络直播 编辑:程序博客网 时间:2024/03/29 22:47

首先将匹配字符分成4个部分

[.] , [.*],[字母+*],[字母]

bool dp[1000][1000];class Solution {public:    bool isMatch(string s, string p) {        memset(dp,0,sizeof(dp));        int n=s.size(),m=p.size();        vector<string> vec;        int i,j;        for(i=0;i<m;i++)        {            string str="";            str+=p[i];            if(p[i]!='*')                vec.push_back(str);            else                vec.back()+=str;        }        dp[0][0]=1;                m=vec.size();        for(i=1;i<=m;i++)        {            string str=vec[i-1];            if(str.size()==2)                dp[i][0]=dp[i-1][0];            for(j=1;j<=n;j++)            {                if(str==".")                {                    if(dp[i-1][j-1])                        dp[i][j]=true;                }                else if(str.size()==2)                {                    if(str[0]=='.')                    {                        if(dp[i-1][j-1]||dp[i-1][j]||dp[i][j-1])                            dp[i][j]=true;                    }                    else                    {                        if(dp[i-1][j])                            dp[i][j]=true;                        else if(str[0]==s[j-1])                        {                            if(dp[i-1][j-1]||dp[i][j-1])                                dp[i][j]=1;                        }                    }                }                else                {                    if(dp[i-1][j-1]&&str[0]==s[j-1])                        dp[i][j]=true;                }            }        }        return dp[m][n];    }};

还可以用递归

class Solution {public:    bool isMatch(string s, string p) {        if(p[0]=='\0')            return p[0]==s[0];        if(p[1]!='*')        {            if(s[0]==p[0]||(p[0]=='.'&&s[0]!='\0'))                return isMatch(s.substr(1),p.substr(1));            else                return false;        }        else        {            while(s[0]&&(s[0]==p[0]||p[0]=='.'))            {                if(isMatch(s,p.substr(2)))                    return true;                s=s.substr(1);            }            return isMatch(s,p.substr(2));        }        return false;    }};


0 0
原创粉丝点击