動態規劃解決萬用字元匹配問題

2021-10-02 16:40:27 字數 2776 閱讀 2350

乙個相似的問題--正規表示式匹配

給定乙個字串(s)和乙個字元模式(p),實現乙個支援』?『和』*'的萬用字元匹配。

』 ? '可以匹配任何單個字元

』 * 』 可以匹配任意字串(包括空字串)

兩個字串完全匹配才算匹配成功

dp[i][j]表示s的前i個字元和p的前j個字元是否匹配

dp[i][j] = dp[i-1][j-1]

1.這個**"?"**作為空字串:

dp[i][j] = dp[i][j-1]

2.這個**"?"**作為任意字串:

dp[i][j] = dp[i][j-1] or dp[i-1][j]

解決s的前0個字元和p的前i個字元能否匹配

dp[0][0] = true

dp[0][i] = dp[0][i-1] and p[i] == "*"

dp[m][n] 即為最優解

#m = len(s) ,n = len(p)

def

ismatch

(s, p)

: m =

len(s)

n =len(p)

dp =[[

false

for _ in

range

(n+1)]

for _ in

range

(m+1)]

dp[m]

[n]=

true

for i in

range

(m,-1,

-1):

for j in

range

(n-1,-

1,-1

):match = i(s[i]

== p[j]

or p[j]

=='.'

)if j+

1=='*'

: dp[i]

[j]= dp[i]

[j+2

]or match and dp[i+1]

[j]else

: dp[i]

[j]= match and dp[i+1]

[j+1

]return dp[0]

[0]

給定字串s和字串p,實現乙個支援" . 「和」 * "的正規表示式匹配

" . " 匹配任意單個字元

" * " 匹配零個或多個前面的那個元素

dp[i][j] 表示s[i:] 和 p[j:] 匹配

m = len(s)

n = len (p)

dp = [[false for _ in range(n+1)] for _ in range(m+1)]

dp[m][n] = true

dp[0][0] 即為最優解

def

ismatch

(s,p)

: m =

len(s)

n =len(p)

dp =[[

false

for _ in

range

(n+1)]

for _ in

range

(m+1)]

dp[m]

[n]=

true

for i in

range

(m-1,-

1,-1

):for j in

range

(n-1,-

1,-1

):match =

(i < m and

(s[i]

== p[j]

or p[j]

=='*'))

if j+

1< n and p[j+1]

=='*'

: dp[i]

[j]= dp[i]

[j+2

]or dp[i+1]

[j]and match

else

: dp[i]

[j]= match and dp[i+1]

[j+1

]return dp[0]

[0]

難點在於分析" * "時如何寫轉移狀態方程使得可以乙個個跳過特定字元最後達到末尾,相當於清空s中的相應某一字元,從而進入到同乙個遞迴式。

狀態結構的初始化也很需要思考。

動態規劃 求解萬用字元問題(wildcard)

p 必須包含 p,左右隨意 bb 必須包含連續的兩個 bb,左右隨意 的匹配處理其實很好處理,困難的地方還在於 的匹配問題。假定給定的正規化包含 m 個 每次出現 就分割 1 次正規化。那麼,此正規化是否對應字串 的問題可分為 m 1 個子問題。例如,正規化t l?o r?ng s可分為。那麼當給出...

44 萬用字元匹配(動態規劃)

給定乙個字串 s 和乙個字元模式 p 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 兩個字串完全匹配才算匹配成功。說明 輸入 s aa p a 輸出 false 解釋 a 無法匹配 aa 整個字串。輸入 s aa p 輸出 true 解釋 可以匹配任意字串。輸...

萬用字元匹配問題

給定乙個字串 s 和乙個字元模式 實現乙個支援 和 的萬用字元匹配。可以匹配任何單個字元。可以匹配任意字串 包括空字串 說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 輸入 s adceb p ab 輸出 true 解釋 第乙個 可以匹...