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

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

傳送門

思路:dpdp。這裏根據題解再梳理一遍。

顯然可以令dp[i][j]dp[i][j]ssii個字符和ppjj個字符是否匹配。

首先我們考慮狀態轉移方程。

1.顯然當p[j1]==?p[j-1]=='?'或者s[i1]==p[j1]s[i-1]==p[j-1]可以直接由dp[i1][j1]dp[i-1][j-1]轉移過來

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

2.如果p[j1]==p[j-1]=='*',顯然可以由dp[i1][j]dp[i][j1]dp[i-1][j]和dp[i][j-1]轉移過來。

即對應*是否爲空串,若是空串直接由dp[i][j1]dp[i][j-1]轉移。

否則不是空串,因爲*可變爲任意字符串所以必能由dp[i1][j]dp[i-1][j]轉移。

其他情況都不能轉移。

再考慮邊界情況,顯然dp[0][0]=1,dp[i][0]=0,(i>0)dp[0][0]=1,dp[i][0]=0,(i>0)

dp[0][i]dp[0][i],需要考慮前ii個字符是否都爲*,若出現??或字母則dp[0][i]=0dp[0][i]=0

時間複雜度: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];
    }
};

ACAC自動機知識待補\dots\dots

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章