摘要:實現(xiàn)支持和的正則表達(dá)式匹配。匹配任意單個字符。匹配零個或多個前面的元素。匹配應(yīng)該覆蓋整個字符串,而不是部分字符串。不過查別人效率比我高的提交中,很多人用的是庫中的匹配函數(shù),心里略微平衡了一點把別人提交的效率最高的代碼貼出來執(zhí)行只用
leetcode上面的題目解題及重構(gòu)
題干:給定一個字符串 (s) 和一個字符模式 (p)。實現(xiàn)支持 "." 和 "*" 的正則表達(dá)式匹配。
"." 匹配任意單個字符。 "*" 匹配零個或多個前面的元素。
匹配應(yīng)該覆蓋整個字符串 (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:])
執(zhí)行用時:1100 ms,執(zhí)行效率算很差,只超過了32%的提交效率
優(yōu)化后第二次提交:
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:])
執(zhí)行用時間優(yōu)化到140 ms,但也只超過了40%的提交效率。
不過查別人效率比我高的提交中,很多人用的是re庫中的匹配函數(shù),心里略微平衡了一點
把別人提交的效率最高的代碼貼出來:
class Solution(object): def isMatch(self, s, p, memo={("",""):True}): 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 {char, "."} and self.isMatch(s[:-1], p, memo)) or self.isMatch(s, p[:-2], memo))) or (exp in {char, "."} and self.isMatch(s[:-1], p[:-1], memo)) return memo[s,p]
執(zhí)行只用36ms
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42748.html
摘要:選擇分組和引用正則表達(dá)式的語法還包括指定選擇項子表達(dá)式分組和引用前一子表達(dá)式的特殊字符。帶圓括號的表達(dá)式的另一個用途是允許在同一正則表達(dá)式的后部引用前面的子表達(dá)式。 正則表達(dá)式(regular expression)是一個描述字符模式的對象。JavaScript的 RegExp類 表示正則表達(dá)式,String和RegExp都定義了方法,后者使用正則表達(dá)式進 行強大的模式匹配和文本檢索與...
摘要:控制權(quán)和傳動這兩個詞可能在搜一些博文或者資料的時候會遇到,這里做一個解釋先控制權(quán)是指哪一個正則子表達(dá)式可能為一個普通字符元字符或元字符序列組成在匹配字符串,那么控制權(quán)就在哪。 溫馨提示:文章很長很長,保持耐心,必要時可以跳著看,當(dāng)然用來查也是不錯的。 正則啊,就像一座燈塔,當(dāng)你在字符串的海洋不知所措的時候,總能給你一點思路;正則啊,就像一臺驗鈔機,在你不知道用戶提交的鈔票真假的時候,...
摘要:正則表達(dá)式一直是里比較難以掌握的點。在中創(chuàng)建正則的兩種方式使用字面量這就是正則表達(dá)式的字面量語法,表示正則表達(dá)式的模式,為正則表達(dá)式的標(biāo)志。字面量形式的正則表達(dá)式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習(xí)慣。 正則表達(dá)式一直是js里比較難以掌握的點。 看不懂,學(xué)不會,記不住。 每次需要用到正則的時候,都需要再去查找資料。 今天花時間把正則的知識點總結(jié)下,希望...
摘要:正則表達(dá)式的意義中的正則表達(dá)式使用表示,可以使用構(gòu)造函數(shù)來創(chuàng)建對象,不過對象更多的是通過一種特殊的直接量語法來創(chuàng)建。用構(gòu)造函數(shù)也可以定義一個與之等價的正則表達(dá)式,代碼如下正則表達(dá)式的模式規(guī)則是由一個字符序列組成的。 正則表達(dá)式的模式匹配 正則表達(dá)式(regular expression)是一個描述字符模式的對象。javascript的RegExp對象表示正則表達(dá)式,String和Reg...
摘要:引用就是允許在同一個正則表達(dá)式的后部引用前面的子表達(dá)式。這個數(shù)字制定了帶圓括號的子表達(dá)式在正則表達(dá)式中的位置。對正則表達(dá)式中前一個子表達(dá)式的引用,并不是指對子表達(dá)式模式的引用,而是指與那個模式匹配的文本的引用。 前言 本文主要是在讀《JavaScript高級程序語言設(shè)計》一書有關(guān)正則表達(dá)式的章節(jié)的知識點記錄,方便后續(xù)查閱。 什么是正則表達(dá)式 正則表達(dá)式是用來描述字符組合的某種規(guī)則。它可...
閱讀 2805·2023-04-25 23:08
閱讀 1594·2021-11-23 09:51
閱讀 1576·2021-10-27 14:18
閱讀 3125·2019-08-29 13:25
閱讀 2839·2019-08-29 13:14
閱讀 2913·2019-08-26 18:36
閱讀 2200·2019-08-26 12:11
閱讀 821·2019-08-26 11:29