LC.44. 通配符匹配(DP)

   日期:2020-07-06     浏览:96    评论:0    
核心提示:LC.44. 通配符匹配(DP)传送门思路:dpdpdp。这里根据题解再梳理一遍。显然可以令dp[i][j]dp[i][j]dp[i][j]为sss前iii个字符和ppp前jjj个字符是否匹配。首先我们考虑状态转移方程。1.显然当p[j−1]==′?′p[j-1]==?p[j−1]==′?′或者s[i−1]==p[j−1]s[i-1]==p[j-1]s[i−1]==p[j−1]可以直接由dp[i−1][j−1]dp[i-1][j-1]dp[i−1][j−1]转移过来即:dp[i][j]=dp

LC.44. 通配符匹配(DP)

传送门

思路: d p dp dp。这里根据题解再梳理一遍。

显然可以令 d p [ i ] [ j ] dp[i][j] dp[i][j] s s s i i i个字符和 p p p j j j个字符是否匹配。

首先我们考虑状态转移方程。

1.显然当 p [ j − 1 ] = = ′ ? ′ p[j-1]=='?' p[j1]==?或者 s [ i − 1 ] = = p [ j − 1 ] s[i-1]==p[j-1] s[i1]==p[j1]可以直接由 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1]转移过来

即: d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j]=dp[i-1][j-1] dp[i][j]=dp[i1][j1].

2.如果 p [ j − 1 ] = = ′ ∗ ′ p[j-1]=='*' p[j1]==,显然可以由 d p [ i − 1 ] [ j ] 和 d p [ i ] [ j − 1 ] dp[i-1][j]和dp[i][j-1] dp[i1][j]dp[i][j1]转移过来。

即对应 ∗ * 是否为空串,若是空串直接由 d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1]转移。

否则不是空串,因为 ∗ * 可变为任意字符串所以必能由 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j]转移。

其他情况都不能转移。

再考虑边界情况,显然 d p [ 0 ] [ 0 ] = 1 , d p [ i ] [ 0 ] = 0 , ( i > 0 ) dp[0][0]=1,dp[i][0]=0,(i>0) dp[0][0]=1,dp[i][0]=0,(i>0)

d p [ 0 ] [ i ] dp[0][i] dp[0][i],需要考虑前 i i i个字符是否都为 ∗ * ,若出现 ? ? ?或字母则 d p [ 0 ] [ i ] = 0 dp[0][i]=0 dp[0][i]=0

时间复杂度: O ( n m ) O(nm) O(nm)

class Solution {
public:
    bool isMatch(string s, string p) {
        int m=s.size(),n=p.size();
        vector<vector<bool> >dp(m+1,vector<bool>(n+1));
        dp[0][0]=1;
        for(int i=1;i<=n;i++)
            if(p[i-1]=='*') dp[0][i]=1;
            else break;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                if(s[i-1]==p[j-1]||p[j-1]=='?') dp[i][j]=dp[i-1][j-1];
                else if(p[j-1]=='*') dp[i][j]=dp[i-1][j]|dp[i][j-1];
            return dp[m][n];
    }
};

A C AC AC自动机知识待补 … … \dots\dots

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服