給定乙個字串 (s) 和乙個字元模式 § ,實現乙個支援 『?』 和 『』 的萬用字元匹配。
『?』 可以匹配任何單個字元。
'』 可以匹配任意字串(包括空字串)。
兩個字串完全匹配才算匹配成功。
說明: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」.
解題思路
動態規劃
採用動態規劃解決:定義dp[i][j]為s[i]和p[j]是否匹配
則轉移方程為:
1、如果p [j] == 』 * 』 ,則dp [ i ] [ j ] = dp[ i-1 ][ j ] | dp [ i ][ j-1 ],代表匹配0個或》=1個
當模式串當前字元為 * 的時候可以匹配任意長度的串(包括0長度)因此主要有下面三種情況:
a、不需要當前的 『 * 』 去匹配
dp[i][j] = dp[i][j-1]
b、需要這個『 * 』去匹配,而且這個還需要匹配別的(因為『 * 』可以匹配串)
dp[i][j] = dp[i-1][j]
c、只需要這個『 * 』匹配本字元就行了 不需要匹配別的串了
dp[i][j] = dp[i-1][j-1]
2、如果p[ j ] in set( [s[i], 『?』 ] ),則dp[ i ][ j ] = dp [ i-1 ][ j-1 ],表示i和j相匹配
3、其他情況dp[ i ][ j ] = false
4、最終的答案即為 dp[m][n],其中 m 和 n 分別是字串 s 和模式 p 的長度。需要注意的是,由於大部分語言中字串的下標從 0 開始,因此 si和pj 分別對應著 s[i−1] 和 p[j−1]。
**
class
solution
:def
ismatch
(self, s:
str, p:
str)
->
bool
:#定義m,n為字串s和模式p的長度
m, n =
len(s)
,len
(p)#用dp[i][j]表示字串 s 的前 i 個字元和模式 p 的前 j 個字元是否能匹配
dp =[[
false]*
(n +1)
for _ in
range
(m +1)
]#當字串 s 和模式 p 均為空時,匹配成功;
dp[0]
[0]=
true
for i in
range(1
, n +1)
: 只有當模式 p的前i個字元均為星號時,dp[0]
[i]才為真
if p[i -1]
=='*'
: dp[0]
[i]=
true
else
:break
for i in
range(1
, m +1)
:for j in
range(1
, n +1)
:if p[j -1]
=='*'
: dp[i]
[j]= dp[i]
[j -1]
| dp[i -1]
[j]elif p[j -1]
=='?'
or s[i -1]
== p[j -1]
: dp[i]
[j]= dp[i -1]
[j -1]
return dp[m]
[n]
時間複雜度:o(mn)
空間複雜度:o(mn)
每日一題 力扣 計畫
98 驗證二叉搜尋樹 問題給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 1.節點的左子樹只包含小於當前節點的數。2.節點的右子樹只包含大於當前節點的數。3.所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3 輸出 true示例2 輸入 5 1 4...
力扣每日一題 6 14
1300 轉變陣列後最接近目標值的陣列和 給你乙個整數陣列 arr 和乙個目標值 target 請你返回乙個整數 value 使得將陣列中所有大於 value 的值變成 value 後,陣列的和最接近 target 最接近表示兩者之差的絕對值最小 如果有多種使得和最接近 target 的方案,請你返...
每日一題力扣48
給定乙個 n n 的二維矩陣 matrix 表示乙個影象。請你將影象順時針旋轉 90 度。你必須在 原地 旋轉影象,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另乙個矩陣來旋轉影象。正解 旋轉90度就是,先鏡面對稱,再轉置即可 class solution defrotate self,mat...