给定一个字符串 两个字符串完全匹配才算匹配成功。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/wildcard-matching 类似题目:LeetCode 10. 正则表达式匹配(递归/DP) 建议先看完第10题再来做本题就相当容易了 1160 ms 27.8 MB 112 ms 27.9 MB python3 解答 1152 ms 21.8 MB
1. 题目
(s)
和一个字符模式 (p)
,实现一个支持 '?'
和 '*'
的通配符匹配。
'?'
可以匹配任何单个字符。'*'
可以匹配任意字符串(包括空字符串)。说明: s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串。 示例 2: 输入: s = "aa" p = "*" 输出: true 解释: '*' 可以匹配任意字符串。 示例 3: 输入: s = "cb" p = "?a" 输出: false 解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。 示例 4: 输入: s = "adceb" p = "*a*b" 输出: true 解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce". 示例 5: 输入: s = "acdcb" p = "a*c?b" 输出: false
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题
class Solution { //C++ public: bool isMatch(string s, string p) { int m = s.size(), n = p.size(), i, j, k; vector<vector<int>> dp(m+1, vector<int>(n+1,0)); dp[0][0] = true; for(i = 0; i <= m; ++i) { for(j = 1; j <= n; ++j) { if(p[j-1]=='*') { for(k = i; k >= 0; --k) { dp[i][j] |= dp[k][j-1];//k=i时,*表示空串 if(dp[i][j]) break;//可以匹配,就不再找了 } } else { if(match(s,p,i,j)) dp[i][j] |= dp[i-1][j-1]; } } } return dp[m][n]; } bool match(string& s, string& p, int i, int j) { return i>0 && (s[i-1]==p[j-1] || p[j-1]=='?'); } };
*
,匹配多个,可以这么想 dp[i-1][j]
匹配了,j
的最后是*
,还在乎多出来一个i
吗class Solution { public: bool isMatch(string s, string p) { int m = s.size(), n = p.size(), i, j, k; vector<vector<int>> dp(m+1, vector<int>(n+1,0)); dp[0][0] = true; for(i = 0; i <= m; ++i) { for(j = 1; j <= n; ++j) { if(p[j-1]=='*') { dp[i][j] |= dp[i][j-1] | (i>0 ? dp[i-1][j] : false); // *匹配0个 *匹配多个(后面多加一个i) } else { if(match(s,p,i,j)) dp[i][j] |= dp[i-1][j-1]; } } } return dp[m][n]; } bool match(string& s, string& p, int i, int j) { return i>0 && (s[i-1]==p[j-1] || p[j-1]=='?'); } };
class Solution: def isMatch(self, s: str, p: str) -> bool: m, n = len(s), len(p) dp = [[0]*(n+1) for _ in range(m+1)] dp[0][0] = 1 for i in range(m+1): for j in range(1,n+1): if p[j-1]=='*': dp[i][j] |= dp[i][j-1] | (dp[i-1][j] if i>0 else 0) else: if i>0 and (s[i-1]==p[j-1] or p[j-1]=='?'): dp[i][j] |= dp[i-1][j-1] return True if dp[m][n] else False
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算