• Regular Expression Matching


    Implement regular expression matching with support for '.' and '*'.
    
    '.' Matches any single character.
    '*' Matches zero or more of the preceding element.
    
    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", "a*") → true
    isMatch("aa", ".*") → true
    isMatch("ab", ".*") → true
    isMatch("aab", "c*a*b") → true

    思路:对于字符串匹配,s[i]和p[j].此题的关键就在于p[j+1]是否为'*'.递归思路解题。

    如果p[j+1]!='*',s[i]==p[j],则匹配下一位(i+1,j+1),如果s[i]!=p[j],匹配失败

    如果p[j+1]=='*',s[i]==p[j],则匹配(i,j+2)或者(i+1,j+2),如果s[i]!=p[j],则匹配(i,j+2)

    class Solution {
    public:
        bool isMatch(const char *s, const char *p) {
            if(*p=='')
                return *s=='';
            if(*(p+1)!='*')
            {
                while(*s!='' && (*s==*p || *p=='.'))
                {
                    return isMatch(s+1,p+1);
                }
            }
            else
            {
                while(*s!='' && (*s==*p||*p=='.'))
                {
                    if(isMatch(s,p+2))
                        return true;
                    s++;
                }
                return isMatch(s,p+2);
            }
            return false;
        }
    };

     使用动态规划解题,思路和上述很相似,dp[j][i]表示s[0..j]和p[0...j]是否匹配;

    class Solution {
    public:
        bool isMatch(const char *s, const char *p) {
            int slen=strlen(s);
        int plen=strlen(p);
        vector<vector<bool> > dp(slen+1,vector<bool>(plen+1,false));
        dp[0][0]=true;
        for(int i=1;i<=plen;++i)
        {
            if(p[i]!='*')
            {
                for(int j=1;j<=slen;++j)
                {
                    dp[j][i]=(dp[j-1][i-1] && (s[j-1]==p[i-1]||p[i-1]=='.'));
                }
            }
            else
            {
                dp[0][i]=dp[0][i+1]=dp[0][i-1];
                for(int j=1;j<=slen;++j)
                {
                    dp[j][i]=dp[j][i+1]=(dp[j-1][i]&&(s[j-1]==p[i-1] || p[i-1]=='.')||dp[j][i-1]);
                }
                ++i;
            }
        }
        return dp[slen][plen];
        }
    };
  • 相关阅读:
    Git快速入门
    Django(一)入门基础——hello world
    JS获取浏览器地址栏的多参数值的任意值
    EasyUI 中的双击某行 并赋值给input事件
    T-SQL 创建触发器 禁止插入空值
    从xxxx检测到有潜在危险的 Request.Form 提示黄页
    Linux基本常用命令|ubuntu获取root权限
    MySQL操作数据库值mysql事务
    ASP.NET免费发送邮件|
    经典JS 判断上传文件大小和JS即时同步电脑时间
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3811616.html
Copyright © 2020-2023  润新知