力扣 面試題19. 正則表達式匹配 dp

https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof/
在這裏插入圖片描述思路:dp[i][j]dp[i][j]表示aa的前ii個字符和bb的前jj個字符能否匹配。那麼答案就是dp[n][m]dp[n][m],現在考慮怎麼轉移,因爲兩個字符串的下標都是從00開始的,所以要通過i1j1i-1、j-1的關係來推出dp[i][j]dp[i][j]的狀態。(1)(1)如果b[j1]b[j-1]不等於*,那麼當a[i1]=b[j1]a[i-1]=b[j-1]b[j1]=.b[j-1]='.'時,有dp[i][j]=dp[i1][j1]dp[i][j]=dp[i-1][j-1](2)(2)如果b[j1]b[j-1]等於*,這時實際上有兩種情況,第一種就是a[i1]a[i-1]不和b[j2]b[j-2]匹配,也就是說aa的前ii個字符和bb的前j2j-2個字符匹配,所以有dp[i][j]=dp[i][j]dp[i][j2]dp[i][j]=dp[i][j]||dp[i][j-2];當然還有第二種情況,就是a[i1]a[i-1]b[j2]b[j-2]匹配,那麼此時要判斷a[i1]=b[j2]a[i-1]=b[j-2]b[j2]=.b[j-2]='.',如果匹配上了,那麼前一個狀態就是aa的前i1i-1個字符和bb的前jj個字符匹配,所以有dp[i][j]=dp[i][j]dp[i1][j]dp[i][j]=dp[i][j]||dp[i-1][j]

class Solution {
public:
    bool isMatch(string a, string b) {
        int n=a.size(),m=b.size();
        vector<vector<bool>> dp(n+1);
        for(int i=0;i<=n;i++)
            dp[i].resize(m+1);
        dp[0][0]=1;
        for(int i=1;i<=n;i++)
            dp[i][0]=0;
        for(int i=0;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                if(i&&j&&b[j-1]!='*')
                {
                    if(a[i-1]==b[j-1]||b[j-1]=='.')
                        dp[i][j]=dp[i-1][j-1];
                }
                else if(j&&b[j-1]=='*')
                {
                    if(j>=2)
                        dp[i][j]=dp[i][j]||dp[i][j-2];
                    if(i&&j>=2&&(a[i-1]==b[j-2]||b[j-2]=='.'))
                        dp[i][j]=dp[i][j]||dp[i-1][j];
                }
            }
        }
        return dp[n][m];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章