LeetCode44. 通配符匹配(python,動態規劃) 通用解法

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. 解法

常見兩個字符串的比較,比如找最長公共子串等題目,這個類型一般通過定義二維數組dp[i][j]dp[i][j], 含義爲 字符串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)]

時間複雜度:O(n2)O(n^2);
空間複雜度:O(n2)O(n^2).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章