(力扣每日一題) 萬用字元匹配

2021-10-07 18:58:34 字數 2499 閱讀 3322

給定乙個字串 (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...