乙個相似的問題--正規表示式匹配
給定乙個字串(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] = truedp[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 解釋 第乙個 可以匹...