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=