1. 題目
給定一個字符串 (s) 和一個字符模式 ( p ) ,實現一個支持 ‘?’ 和 ‘*’ 的通配符匹配。
‘?’ 可以匹配任何單個字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
兩個字符串完全匹配纔算匹配成功。
說明:
s 可能爲空,且只包含從 a-z 的小寫字母。
p 可能爲空,且只包含從 a-z 的小寫字母,以及字符 ? 和 *。
來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/wildcard-matching
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
示例 1:
輸入:
s = "aa"
p = "a"
輸出: false
解釋: “a” 無法匹配 “aa” 整個字符串。
2. 解法
常見兩個字符串的比較,比如找最長公共子串等題目,這個類型一般通過定義二維數組, 含義爲 字符串1 s[:(i-1)]
和字符串p[:(j-1)]
是否能夠完全匹配(這樣dp[0][0]
可以覆蓋特殊情況s,p 其中一個是空字符串的情形)。
然後考慮狀態轉移方程,這裏,主要是 *
,?
和普通字符三種。如果是普通字符,只需要考慮 s[i] == s[j]
以及前面字符是否能完全匹配dp[i-1][j-1]
. ?
也是這種情況。 如果p[j-1] == '*'
, 就要考慮三種小情況, *
作爲空字符串,需要判斷狀態dp[i][j-1]
; *
作爲任意單個字符,需要判斷dp[i-1][j-1]
; *
作爲一串字符,這時考慮dp[i-1][j]
(這裏代表 *
匹配 s
索引i-1
及它前面的元素)。
class Solution:
def isMatch(self, s: str, p: str) -> bool:
dp = [[False for _ in range(len(p)+1)] for _ in range(len(s)+1)]
dp[0][0] = True
for i in range(len(s)+1):
for j in range(1,len(p)+1):
if p[j-1] == '*':
if i == 0:
dp[i][j] = dp[i][j-1]
else:
if dp[i-1][j-1] or dp[i-1][j] or dp[i][j-1]:
dp[i][j] = True
else:
if i == 0:
break
if s[i-1] == p[j-1] or p[j-1] == '?':
if dp[i-1][j-1]:
dp[i][j] = True
return dp[len(s)][len(p)]
時間複雜度:;
空間複雜度:.