10 正規表示式匹配

2021-10-04 02:21:38 字數 2270 閱讀 4404

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 『.』 和 『』 的正規表示式匹配。

『.』 匹配任意單個字元

'』 匹配零個或多個前面的那乙個元素

所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。

說明:s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母,以及字元 . 和 *。

class

solution

:def

ismatch

(self, s:

str, p:

str)

->

bool

: i=j=

0# i搜尋s,j搜尋p

while i<

len(s)

and j<

len(p)

:if j<

len(p)-1

:#只要不是最後乙個,都對後乙個元素檢驗是不是*

if p[j]

=="."

and p[j+1]

=="*"

:#.加*,對s列表往後檢索

j+=2if j==

len(p)

:return

true

else

:pass

elif p[j+1]

=="*"

:#普通字元加*,用while語句來除去等於當前字元的字元

while i<

len(s)

and s[i]

==p[j]

: i+=

1 j+=

2elif p[j]

=="."

:#僅有乙個.,直接往後移一位

j+=1 i+=

1else

:#直接檢驗當前元素是否相同

if s[i]

==p[j]

: j+=

1 i+=

1else

:return

false

else

:#如果到了最後乙個元素了,直接比較檢驗就行了

if s[i]

==p[j]

: j+=

1 i+=

1return

true

if i==

len(s)

and j==

len(p)

else

false

就是最普通的思路慢慢去匹配。但是遇到".#"這種情況就不知道怎麼解決了

class

solution

:def

ismatch

(self, s:

str, p:

str)

->

bool:if

not p:

return

not s

# 第乙個字母是否匹配

first_match =

bool

(s and p[0]

in)# 如果 p 第二個字母是 *

iflen

(p)>=

2and p[1]

=="*"

:return self.ismatch(s, p[2:

])or(first_match and self.ismatch(s[1:

], p)

)else

:return first_match and self.ismatch(s[1:

], p[1:

])

這個是題解裡面的

先判斷第乙個元素,得出布林值,再對第二個元素進行判斷是否為*。如果是*,有兩種情況,乙個是忽略*前的元素,這種情況下直接把s和少了前兩個元素的p帶入原函式進行迭代。第二種情況是有乙個或多個元素這種情況下把少了第乙個元素的s和p帶入原函式進行迭代。然後兩種情況都算出來再進行或運算,得出答案

執行用時 :1808 ms, 在所有 python3 提交中擊敗了9.32%的使用者

記憶體消耗 :13.5 mb, 在所有 python3 提交中擊敗了5.13%的使用者

10 正規表示式匹配

implement regular expression matching with support for and matches any single character.matches zero or more of the preceding element.the matching sho...

10 正規表示式匹配

思路類似最長公共子串行,dp i j dp i 1 j 1 如果s i p j p j dp i j 2 如果p j s i p j 1 dp i 1 j dp i j 1 dp i 1 j 1 dp i 1 j 2 dp i j 2 如果p j s i p j 1 稍稍解釋下 對於s和p,設各個最...

10 正規表示式匹配

剛開始很奇怪為什麼這個題的標籤是困難,然後寫了出來發現我寫出來的只針對從頭到尾都一樣,而不是如示例4,可以匹配一部分。示例 4 輸入 s aab p c a b 輸出 true 解釋 因為 表示零個或多個,這裡 c 為 0 個,a 被重複一次。因此可以匹配字串 aab 只針對從頭到尾相同的字串的程式...