题意:


方法:
动态规划

思路:
dp[i][j]表示字符串s的前i个字符与字符串p的前j个字符是否匹配。

状态转移方程:
1.当s[i-1]==p[j-1] || p[j-1]=='?'时,则匹配;


2.当p[j-1]=='*'时,则匹配空或单个字符;


3.否则,匹配失败。



        

class Solution {
public:
    
    bool isMatch(const char *s, const char *p) {
        int n1=strlen(s),n2=strlen(p);
        
        int dp[1005][1005]={0};//dp[i][j]表示字符串s的前i个字符与字符串p的前j个字符是否匹配
        dp[0][0]=1;//初始化
        for(int i=1;i<=n2;i++){
            dp[0][i]=dp[0][i-1]&&(p[i-1]=='*');
        }
        for(int i=1;i<=n1;i++){//二重循环
            for(int j=1;j<=n2;j++){
                if(s[i-1]==p[j-1]||p[j-1]=='?'){//当s[i-1]==p[j-1]||p[j-1]=='?'时,则匹配
                    dp[i][j]=dp[i-1][j-1];
                }else if(p[j-1]=='*'){//当p[j-1]=='*'时,则匹配空或至少一个字符
                    dp[i][j]=dp[i][j-1]||dp[i-1][j];
                }else{//否则,匹配失败
                   dp[i][j]=0;
                }
            }
        }
        return dp[n1][n2]==1?true:false;
    }
};


时间复杂度:
空间复杂度: