暴力求解:
動態規劃,如果p[j] == s[i], 那麼dp[i][j] = dp[i-1][j-1],意思就是說,如果p的第j個字元和s的第i個字元匹配上了,那麼dp[i][j]是否為true取決於dp[i-1][j-1]
如果p[j] == 『.』,那麼p[j]此時就可以匹配任意字元,情況就和1一樣了,dp[i][j] = dp[i-1][j-1]
如果p[j] == 『*』,那麼此時又要分3中情況:
如果p[j-1] != 『.』 and p[j-1] != s[i],也就說之前的字元不能和當前字元s[i]匹配上,那麼這個時候我們也不直接將dp[i][j]設定為false,而是將此時的 * 看作個數為0,檢視dp[i][j-2]的狀態,即j的前2位的狀況.此時dp[i][j] = dp[i][j-2]
否則話,說明p[j-1]能夠和s[i]匹配上,那麼此時就會有3個狀態,分別當作0個 1個 多個來用,對應的狀態就是
dp[i][j] = dp[i][j-2], *當作0個來用
dp[i][j] = dp[i][j-1], *當作1個來用
dp[i][j] = dp[i-1][j],*當作多個來用
class
solution
:def
ismatch
(self, s:
str, p:
str)
->
bool
:if s ==
none
and p ==
none
:return
true
n =len(s)
m =len(p)
dp =[[
false
for _ in
range
(m+1)]
for _ in
range
(n+1)]
dp[0]
[0]=
true
for j in
range
(m):
if p[j]
=='*'
and dp[0]
[j-1]:
dp[0]
[j+1]=
true
for i in
range(0
, n)
:for j in
range(0
, m)
:if p[j]
=='.'
or p[j]
== s[i]
: dp[i+1]
[j+1
]= dp[i]
[j]elif p[j]
=='*'
:if p[j-1]
!= s[i]
and p[j-1]
!='.'
: dp[i+1]
[j+1
]= dp[i+1]
[j-1
]# 相當於*為0個元素
else
: dp[i+1]
[j+1
]= dp[i+1]
[j-1
]or dp[i+1]
[j]or dp[i]
[j+1
]# *為0個
# *為1個
# *為多個
return dp[n]
[m]
這樣做有些麻煩,我發現乙個非常好的做法:
class
solution
:def
ismatch
(self, s:
str, p:
str)
->
bool:if
not p:
return
not s
first =
bool
(s)and p[0]
in#這裡是用來判斷s是否為空,p[0]是否等於s[0]或者"."
iflen
(p)>=
2and p[1]
=='*'
:return self.ismatch(s, p[2:
])or first and self.ismatch(s[1:
], p)
#判斷p下乙個元素是否與s匹配 並判斷s什麼時候能和p元素匹配
else
:return first and self.ismatch(s[1:
], p[1:
])#判斷下一組
用了遞迴的思想,思路在注釋中。
其實還有其他方法,明天再更。
Leetcode 正規表示式匹配
給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...
Leetcode 正規表示式匹配問題
給定乙個字串 s 和乙個字元模式 p 實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個字串 s 而不是部分字串。說明 示例 1 輸入 s aa p a 輸出 false解釋 a 無法匹配 aa 整個字串。示例 2 輸入 s aa p a 輸出 true解釋...
正規表示式 匹配
字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...