題目鏈接
難度:困難 ??????類型: 動態(tài)規(guī)劃
給定一個字符串 (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 = "ab"
輸出: true
解釋: 第一個 '' 可以匹配空字符串, 第二個 '' 可以匹配字符串 "dce".
示例5
輸入:
s = "acdcb"
p = "a*c?b"
輸入: false
解題思路
狀態(tài)轉移方程:
如果p[i] == s[j] 或 p[i]=='?': dp[i+1][j+1] = dp[i][j]
如果 p[i] == '*': dp[i+1][j+1] = dp[i+1][j] or dp[i][j+1]
dp的第一列要特殊處理,針對首字符為‘*’的情況
代碼實現
class Solution(object):
def isMatch(self, s, p):
"""
:type s: str
:type p: str
:rtype: bool
"""
m, n = len(s), len(p)
dp = [[False] * (m+1) for _ in range(n+1)]
dp[0][0] = True
for i in range(n):
if p[i] == '*':
dp[i+1][0] = dp[i][0]
for i in range(n):
for j in range(m):
if p[i] == s[j] or p[i]=='?':
dp[i+1][j+1] = dp[i][j]
elif p[i] == '*':
dp[i+1][j+1] = dp[i+1][j] or dp[i][j+1]
return dp[-1][-1]