失敗的嘗試 10. regular expression matching & 正則
阿新 • • 發佈:2018-07-25
循環 urn counter perf += 解釋 expected exp 感覺 字符串s中s[1]的
Regular Expression Matching
看到正則就感覺頭大,因為正則用好了就很強大。有挑戰的才有意思。
其實沒有一點思路。循環的話,不能一一對比,匹配模式解釋的是之前的字符。那就先遍歷模式把。
... 中間 n 次失敗的提交
感覺代碼邏輯很亂。重新捋一下再動手寫。
找幾個重點分析一下:
Wrong Answer:
Input:
"aaa"
"ab*a*c*a"
Output:
false
Expected:
true
調試
aaa ab*a*c*a
0 a a s
1 a b n
1 a * * b
1 a a s
2 a * * a
prev char eq
False
分析,aaa
a
被模式p[3]中的a
匹配了,然後s[2]的a
被p[4]的*
匹配了。還是沒有解決*
匹配0次的問題,那就得預先判斷後面是啥模式而不是在之後判斷前面的一個模式是啥。
N小時後來更,改了好多次沒有解決匹配0-多次字符之後還有該字符。
可能我鉆牛角尖了,刪掉重新想一種思路。
... 又 n 次失敗的本地測試
failed submission
import time class Solution: def __init__(self): self.any=‘.‘ # any character self.zom=‘*‘ # zero or more def isMatch(self, s, p): """ :type s: str :type p: str :rtype: bool """ ci=0 prevPattern=None for pi,pa in enumerate(p): if ci==len(s): if len(s)==0: continue if ci>0 and prevPattern==self.zom: ci-=1 else: break print("other:",pa) #continue while ci < len(s): ci+=1 print(pi,pa,ci-1,s[ci-1],end="| ") if pa==self.any: print(‘.‘) break elif pa==self.zom: print(‘*‘,prevPattern) if prevPattern==self.any: continue elif prevPattern==s[ci-1]: continue else: # no match, end processing pass #prevPattern=‘‘ ci-=1 break break elif pa==s[ci-1]: # same character print(‘s‘) break else: print(‘n‘) ci-=1 break prevPattern=pa else: return ci==len(s) return False if __name__ == "__main__": data = [ { "input":{‘s‘:‘aa‘,‘p‘:‘a‘}, "output":False, }, { "input":{‘s‘:‘aa‘,‘p‘:‘a*‘}, "output":True, }, { "input":{‘s‘:‘ab‘,‘p‘:‘.*‘}, "output":True, }, { "input":{‘s‘:‘aab‘,‘p‘:‘c*a*b‘}, "output":True, }, { "input":{‘s‘:‘mississippi‘,‘p‘:‘mis*is*p*.‘}, "output":False, }, { "input":{‘s‘:‘aaa‘,‘p‘:‘ab*a*c*a‘}, "output":True, }, { "input":{‘s‘:‘ab‘,‘p‘:‘.*c‘}, "output":False, }, { "input":{‘s‘:‘axb‘,‘p‘:‘a.b‘}, "output":True, }, { "input":{‘s‘:‘mississippi‘,‘p‘:‘mis*is*ip*.‘}, "output":True, }, { "input":{‘s‘:‘aaa‘,‘p‘:‘a*a‘}, "output":True, }, { "input":{‘s‘:‘‘,‘p‘:‘.*‘}, "output":True, }, { "input":{‘s‘:‘aaa‘,‘p‘:‘aaaa‘}, "output":False, }, { "input":{‘s‘:‘a‘,‘p‘:‘ab*‘}, "output":True, } ]; for d in data: print(d[‘input‘][‘s‘],d[‘input‘][‘p‘]) # 計算運行時間 start = time.perf_counter() result=Solution().isMatch(d[‘input‘][‘s‘],d[‘input‘][‘p‘]) end = time.perf_counter() print(result) if result==d[‘output‘]: print("--- ok ---",end="\t") else: raise Exception print(start-end)
不行,今天大半天都浪費到這上面了,懷疑人生。
去搜索一下,發現:
- 簡易正則表達式引擎的實現 裏面又推薦了:
- 中國科學技術大學-編譯原理 我雲課堂裏收藏過這個啊
- 輪子哥-《構造正則表達式引擎》新鮮出爐啦!
總結:想法本來就沒有成熟,之前的題目都是一些常規的,這個正則不研究沒有理論支撐可不好用。
等日後再戰
失敗的嘗試 10. regular expression matching & 正則