正規表示式匹配

2021-09-13 02:22:49 字數 2208 閱讀 2220

leetcode上面的題目解題及重構

題幹:給定乙個字串 (s) 和乙個字元模式 (p)。實現支援 '.' 和 '*' 的正規表示式匹配。

'.' 匹配任意單個字元。 

'*' 匹配零個或多個前面的元素。

匹配應該覆蓋整個字串 (s) ,而不是部分字串。

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

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

題目及示例傳送門

如果直接用re,那這題就沒意義了,所以肯定要自己寫匹配演算法

第一次成功提交**:

class solution(object):

def ismatch(self, s, p):

""":type s: str

:type p: str

:rtype: bool

"""if p == '':

return s == ''

if len(p) == 1:

return len(s) == 1 and (s == p or p == '.')

if p[1] != '*':

if s == '':

return false

return (p[0] == s[0] or p[0] == '.') and self.ismatch(s[1:], p[1:])

while s and (p[0] == s[0] or p[0] == '.'):

if self.ismatch(s, p[2:]):

return true

s = s[1:]

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

執行用時:1100 ms,執行效率算很差,只超過了32%的提交效率

優化後第二次提交:

def ismatch(self, s, p):

""":type s: str

:type p: str

:rtype: bool

"""if p == "":

return s == ""

if len(p) == 1:

return false if len(s) != 1 else (s == p or p == "." or p == "*")

if (p[-1] != '*') and (p[-1] != '.') and (p[-1] not in s):

return false

if (p[1] != '*'):

return s != '' and (p[0] == s[0] or p[0] == '.') and self.ismatch(s[1:], p[1:])

else:

while s and (p[0] == s[0] or p[0] == '.'):

if self.ismatch(s, p[2:]):

return true

s = s[1:]

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

執行用時間優化到140 ms,但也只超過了40%的提交效率。

不過查別人效率比我高的提交中,很多人用的是re庫中的匹配函式,心裡略微平衡了一點

把別人提交的效率最高的**貼出來:

class solution(object):

def ismatch(self, s, p, memo=):

if not p and s: return false

if not s and p: return set(p[1::2]) == and not (len(p) % 2)

if (s,p) in memo: return memo[s,p]

char, exp, prev = s[-1], p[-1], 0 if len(p) < 2 else p[-2]

memo[s,p] =\

(exp == '*' and ((prev in and self.ismatch(s[:-1], p, memo)) or self.ismatch(s, p[:-2], memo)))\

or\(exp in and self.ismatch(s[:-1], p[:-1], memo))

return memo[s,p]

執行只用36ms

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...