Leetcode 44. 通配符匹配 困难 动态规划 精选 TOP 面试题

44. 通配符匹配

题目:

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:

s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:

输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

 

思路:

在给定的模式 pp 中,只会有三种类型的字符出现:

小写字母 a-za−z,可以匹配对应的一个小写字母;

问号 ??,可以匹配任意一个小写字母;

星号 *∗,可以匹配任意字符串,可以为空,也就是匹配零或任意多个小写字母。

其中「小写字母」和「问号」的匹配是确定的,而「星号」的匹配是不确定的,因此我们需要枚举所有的匹配情况。为了减少重复枚举,我们可以使用动态规划来解决本题。

我们用dp[i][j] 表示字符串 s 的前 i 个字符和模式p 的前 j 个字符是否能匹配。在进行状态转移时,我们可以考虑模式 p 的第 j个字符pj,与之对应的是字符串 s 中的第 i 个字符 si

 

 

 

 边界条件为

 

 

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

 

posted @ 2022-06-09 18:56  鸭子船长  阅读(36)  评论(0编辑  收藏  举报