解題思路:
其實這一道題利用遞迴的思想就可以做出來,然後需要對正規表示式熟悉一點就可以了,然後做好邊界條件的判斷即可。
1.當正規表示式和需要匹配的字串都為空或者有一者為空的情況需要自己思考具體情況做出邊界判斷;
2.然後接下來就是利用遞迴的思想,寫遞迴式。
具體**如下:
class
solution
:def
ismatch
(self, s:
str, p:
str)
->
bool
:'''
for the use of '.' and '*'
'''iflen
(s)==
0and
len(p)==0
:return
true
iflen
(s)!=
0and
len(p)==0
:return
false
iflen
(s)==
0and
len(p)!=0
and'*'
notin p:
return
false
iflen
(s)==
0and
len(p)==1
:return
false
iflen
(s)==
0and p[1]
!='*'
:return
false
iflen
(s)==
0and p[1]
=='*'
:return self.ismatch(s, p[2:
])iflen
(s)!=
0and
len(p)!=0
:#避免時間**,乙個'a*'和多個'a*'效果完全一樣,但是計算的時間複雜度減少了很多
while
len(p)
>=
4and p[1]
=='*'
and p[:2
]== p[2:
4]: p = p[2:
]iflen(p)==1
:iflen(s)
!=len
(p):
return
false
else
:if s == p or p ==
'.':
return
true
else
:return
false
else
:#with *
if p[1]
=='*'
:if p[0]
=='.'
:return self.ismatch(s, p[2:
])or self.ismatch(s[1:
], p)
else
:if p[0]
== s[0]
:return self.ismatch(s, p[2:
])or self.ismatch(s[1:
], p)
elif p[0]
!= s[0]
:return self.ismatch(s, p[2:
])#without *
else
:if p[0]
== s[0]
or p[0]
=='.'
:return self.ismatch(s[1:
], p[1:
])if p[0]
!= s[0]
:return
false
LeetCode10 正規表示式
給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...
LeetCode 10 正規表示式匹配
實現支援 和 的正規表示式匹配。匹配任意單個字元。匹配零個或多個前面的元素。匹配應該覆蓋整個輸入字串 不是部分字串 函式 bool ismatch const char s,const char p 例子 ismatch aa a false ismatch aa aa true ismatch a...
leetCode 10 正規表示式匹配
這道題花了功夫,所以把想到的的寫下來。這個要從字串的屁股開始匹配。道理很簡單,從正面匹配,匹配的方式很多,需要全部列舉,不利於縮小問題規模,舉個例子,aac和a a a c,從正面開始匹配,從全部需要列舉的匹配情況中舉幾個例子 aac匹配a a a c,匹配a a a c,匹配a a a c。從屁股...