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

  • 相关阅读:
    在SQLite中使用索引优化查询速度
    SQLite支持的SQL数据操作
    left (outer) join , right (outer) join, full (outer) join, (inner) join, cross join 区别
    深入理解Android内存管理原理(六)
    Merge Sorted Array
    Sort Colors
    Construct Binary Tree from Preorder and Inorder Traversal
    Binary Tree Postorder Traversal
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/joelwang/p/11210903.html
Copyright © 2011-2022 走看看