• leetcode 正则表达式匹配


    类似题目:通配符匹配

    动态规划解法:

    1. p[j] == s[i]:  dp[i][j] = dp[i-1][j-1]

    2. p[j] == ".":   dp[i][j] = dp[i-1][j-1]

    3. p[j] =="*":

      3.1 p[j-1] != s[i]:  dp[i][j] = dp[i][j-2]

      3.2 p[i-1] == s[i] or p[i-1] == ".":

        dp[i][j] = dp[i-1][j] // 多个a的情况

        or dp[i][j] = dp[i][j-1] // 单个a的情况

        or dp[i][j] = dp[i][j-2] // 没有a的情况

    C++代码:

    class Solution {
    public:
        bool isMatch(string s, string p) {
            int ls=s.size(),lp=p.size();
            vector< vector<int> > dp(ls+1,vector(lp+1,0));
            dp[0][0]=1;
            int flag=1;
            for(int j=0;j<lp;j++){
                if(j>=1 && p[j-1]!='*' && p[j]!='*') flag=0;
                if(p[j]=='*') dp[0][j+1]=flag;//else dp[0][j]=0 没必要写
            }
            
            for(int i=0;i<ls;i++){
                for(int j=0;j<lp;j++){
                    if(s[i]==p[j] || p[j]=='.'){
                        dp[i+1][j+1]=dp[i][j];
                    }else if(p[j]=='*'){
                        if(p[j-1]!=s[i] && p[j-1]!='.'){
                            dp[i+1][j+1]=dp[i+1][j-1];
                        }else{
                            dp[i+1][j+1]=dp[i+1][j-1] || dp[i+1][j] || dp[i][j+1];
                        }
                    }
                }
            }
            return dp[ls][lp];
        }
    };

    之前看动态规划的解法,此处尝试直接利用逻辑关系匹配未果,还有几十样例没有通过,应该是*.情景的判断出现了问题,其实主要可以分为以下几个情况:

    是s[i]==p[j] 完全匹配

    a*.b这种有可能是0个a,然后.匹配任意字符,也有可能是数个a,但此时会忽略可能出现几个a的情况;

    .*匹配任意字符串,还比较好处理

    class Solution {
    public:
        bool isMatch(string s, string p) {
            int ls=s.size(),lp=p.size();
            int i=0,j=0,match=0,start=-1;
            while(i<s.size()){
                if(j<lp && (s[i]==p[j] || p[j]=='.') ){
                    i++;j++;
                }else if(j<lp && p[j]=='*'){
                    start=j-1;
                    match=i;
                    j++;
                }else if(start!=-1 && (p[start]==s[i] || p[start]=='.') ){
                    match++;
                    i=match;
                    j=start+1;
                }else if(j+1<p.size() && p[j+1]=='*'){
                    j++;
                }else
                    return false;
            }
            while(j<p.size()){
                if(p[j]!='*') return false;
                j++;
            }
            return true;
        }
    };

    p[j] == s[i]:dp[i][j] = dp[i-1][j-1]
    p[j] == ".":dp[i][j] = dp[i-1][j-1]
    p[j] =="*":
    3.1 p[j-1] != s[i]:dp[i][j] = dp[i][j-2]
    3.2 p[i-1] == s[i] or p[i-1] == ".":
    dp[i][j] = dp[i-1][j] // 多个a的情况
    or dp[i][j] = dp[i][j-1] // 单个a的情况
    or dp[i][j] = dp[i][j-2] // 没有a的情况
    作者:powcai链接:https://leetcode-cn.com/problems/two-sum/solution/dong-tai-gui-hua-by-powcai/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    产品运营干货丨如何设计SAAS系统?
    SpringBoot原理及应用布署(中信银行)
    让大家出系分
    MyBatis的执行原理详细介绍
    技术管理进阶——一线Leader怎么做?经理的速成宝典
    技术管理进阶——如何脱颖而出?
    技术管理进阶——扎心了!老板问我:你们技术部和外包团队有什么区别?
    技术管理进阶——为什么要多总结,如何做总结?
    程序员与产品之间应该如何配合,什么时候技术为重,什么时候产品为重?
    java快速寻找一个数组的最大值或最小值, min, max,三种方法
  • 原文地址:https://www.cnblogs.com/joelwang/p/11210903.html
Copyright © 2020-2023  润新知