目录
- 题目
- 答案
- 运行结果
题目
给你一个输入字符串 (s) 和一个字符模式 § ,请你实现一个支持 ‘?’ 和 ‘’ 匹配规则的通配符匹配:
‘?’ 可以匹配任何单个字符。
'’ 可以匹配任意字符序列(包括空字符序列)。
判定匹配成功的充要条件是:字符模式必须能够 完全匹配 输入字符串(而不是部分匹配)。
示例 1:
输入:s = “aa”, p = “a”
输出:false
解释:“a” 无法匹配 “aa” 整个字符串。
示例 2:
输入:s = “aa”, p = ""
输出:true
解释:'’ 可以匹配任意字符串。
示例 3:
输入:s = “cb”, p = “?a”
输出:false
解释:‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
提示:
- 0 <= s.length, p.length <= 2000
- s 仅由小写英文字母组成
- p 仅由小写英文字母、‘?’ 或 ‘*’ 组成
答案
我们定义状态 dp[i][j] 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配。
状态转移方程如下:
dp[i][j]={ dp[i−1][j−1] if s[i−1]=p[j−1] or p[j−1]=? dp[i−1][j−1]∨dp[i−1][j]∨dp[i][j−1] if p[j−1]=* false otherwise
时间复杂度 O(m×n),空间复杂度 O(m×n)。其中 m 和 n 分别为 s 和 p 的长度。
class Solution(object):def isMatch(self, s, p):""":type s: str:type p: str:rtype: bool"""m, n = len(s), len(p)dp = [[False] * (n + 1) for _ in range(m + 1)]dp[0][0] = Truefor j in range(1, n + 1):if p[j - 1] == '*':dp[0][j] = dp[0][j - 1]for i in range(1, m + 1):for j in range(1, n + 1):if s[i - 1] == p[j - 1] or p[j - 1] == '?':dp[i][j] = dp[i - 1][j - 1]elif p[j - 1] == '*':dp[i][j] = dp[i - 1][j] or dp[i][j - 1]return dp[m][n]