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]; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
leetcode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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解法。——贪心、转化