zoukankan      html  css  js  c++  java
  • 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)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    Windows Server 2008 R2 服务器系统安装及配置全过程图文详解
    c#多线程
    DevExpress之TreeList控件用作导航使用说明
    Windows操作系统下搭建Git服务器和客户端。
    D^3CTF 2021 8-bit-pub
    shiro-1.2.4反序列化分析踩坑
    *CTF2021 oh-my-bet
    无线网络密码破解初体验
    瑞昱rtl819x-SDK-v3.4.14b的watchdog分析
    RC4加密算法
  • 原文地址:https://www.cnblogs.com/joelwang/p/11210903.html
Copyright © 2011-2022 走看看