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 @   鸭子船长  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2020-06-09 最长公共子序列 (LCS) 详解+例题模板(全)(转)
2017-06-09 palindrome-partitioning I&II——回文切割、深度遍历
2017-06-09 133. Clone Graph (3 solutions)——无向无环图复制
2017-06-09 贪心算法(转)
2017-06-09 Gas Station,转化为求最大序列的解法,和更简单简单的Jump解法。——贪心、转化
点击右上角即可分享
微信分享提示