演算法練習 萬用字元匹配

2021-10-23 01:22:12 字數 2153 閱讀 8569

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

示例 5:

輸入:s = 「acdcb」

p = 「a*c?b」

輸入: false

class

solution

:def

ismatch

(self, s:

str, p:

str)

->

bool

: dp =[[

0for i in

range

(len

(s)+1)

]for j in

range

(len

(p)+1)

] dp[0]

[0]=

1for i in

range(0

,len

(p))

:if p[i]

=="*"

: dp[i+1]

[0]= dp[i][0

]for i in

range(1

,len

(p)+1)

:for j in

range(1

,len

(s)+1)

:if p[i-1]

=="*"

: dp[i]

[j]=

max(dp[i-1]

[j], dp[i]

[j-1])

elif p[i-1]

=="?"

: dp[i]

[j]= dp[i-1]

[j-1

]elif p[i-1]

== s[j-1]

: dp[i]

[j]= dp[i-1]

[j-1

]else

: dp[i]

[j]=

0return dp[-1

][-1

]==1

思路

1們將輸入字串和字元模式的長度 p_len,s_len 和是否匹配 dp [ ][ ] 聯絡起來

2 dp [ ] [ ] 代表的是字元模式中的第 p_i 字元和輸入字串的第 s_i 字元是否匹配。

3如果字元相同或字元模式的字元為 ?,則 dp [p_i ][ s_i ] = dp [p_i -1][ s_i -1 ]

4 如果字元模式的字元為星號且dp [p_i -1][ s_i -1 ] 為ture,則dp [p_i -1][ i ] =true

LeetCode演算法練習之萬用字元匹配

上次的正規表示式匹配就是使用的動態規劃的方法,不過上一次因為寫完程式太晚了,就沒有想自下而上填表法實現的動態規劃。這次就直接使用填表法來解決問題吧。上次的分析同樣可以套用到這次的問題中。我們使用了乙個二維陣列來儲存每個小問題的答案,現在我們分析一下遞迴過程,就可以得出自下而上的填表法解決方案。這張圖...

萬用字元匹配演算法

萬用字元匹配演算法 要求 1,a?b,查詢以a開始,b結尾中間為任意字元的子串出現的次數 2.和的位置可以在前,後或者中間可以有任意多個,可以相互組合 3.起始位置不同的匹配視為兩次不同的匹配,例如,a?b aabbacbc 結果為3,aa aaa結果為2 4.起始位置相同的匹配,視為一次匹配,例如...

萬用字元匹配

implement wildcard pattern matching with support for and matches any single character.matches any sequence of characters including the empty sequence ...