給你乙個字串 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 只針對從頭到尾相同的字串的程式...