欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

力扣 44. 通配符匹配 dp

程序员文章站 2022-07-16 09:54:49
...

https://leetcode-cn.com/problems/wildcard-matching/

力扣 44. 通配符匹配 dp

思路: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[j1]b[j-1]匹配,也就是说aa的前ii个字符和bb的前j1j-1个字符匹配,所以有dp[i][j]=dp[i][j]dp[i][j1]dp[i][j]=dp[i][j]||dp[i][j-1];当然还有第二种情况,就是a[i1]a[i-1]b[j1]b[j-1]匹配,那么前一个状态就是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]=='*')
                {
                    dp[i][j]=dp[i][j]||dp[i][j-1];//不和*匹配
                    if(i)
                        dp[i][j]=dp[i][j]||dp[i-1][j];
                }
            }
        }
        return dp[n][m];
    }
};