leetcode題目10之正規表示式匹配

2021-08-20 10:36:31 字數 2397 閱讀 8014

given an input string (s) and a pattern (p), implement regular expression matching with support for'.'and'*'.

'.' matches any single character.

'*' matches zero or more of the preceding element.

the matching should cover the entire input string (not partial).

note:

解答:採用動態規劃的方法

用dp(i,j)計算text[i:]與patter[j:]匹不匹配.最終要得到的結果就是dp(0,0)。如果i,j已經計算過,就儲存起來,直接返回。沒有計算過,就需要計算。

如果j已經超過了最後乙個字元,那麼只有當i也超過最後乙個字元時,才是匹配。patten為空的情況也包含在這裡。因為兩個字串匹配,最終肯定是要一起結束判斷的。

如果還沒有判斷完,就分為兩種情況。

第一種是帶星號的。這是j後面至少還需要有乙個字元,即j

此時匹配又分為兩種情況:1)text中有0個*前面的字元,那麼此時的dp(i,j)直接等於dp(i,j+2),即*和他前面的不需要再判斷。

2)text中有多個1或多個*前面的字元,那麼此時首先須保證text[i]和text[j]匹配,然後再把text[i]去掉後判斷即可。即text[i+1:]與pattter[j:]是否匹配

第二種情況是單字元的匹配,即沒有星號的匹配。j可能等於pattern最後乙個字元位置(因為大於最後乙個字元位置的情況在前面被排除了)或pattern[j+1]不是星號。此時只要i還沒越界,切pattern[j]==text[i]或.即可。呢麼dp(i,j) == dp(i+1,j+1),即當前字元text[i]和pattern[j]匹配,只要後面也匹配即可。

每次把結果儲存起來,可以方便下次如果用到同樣的數的話不用再次重複計算,大大提高效率

class solution(object):

def ismatch(self, text, pattern):

memo = {}

def dp(i, j):

if (i, j) not in memo:

if j == len(pattern):

ans = i == len(text)

else:

first_match = i < len(text) and pattern[j] in

if j+1 < len(pattern) and pattern[j+1] == '*':

ans = dp(i, j+2) or first_match and dp(i+1, j)

else:

ans = first_match and dp(i+1, j+1)

memo[i, j] = ans

return memo[i, j]

return dp(0, 0)

第二種方法:

遞迴class solution(object):

def ismatch(self, s, p):

""":type s: str

:type p: str

:rtype: bool

"""#如果只有.只需要乙個元素乙個元素比較,或者相等或者p中是.

#如果有*,*要與前乙個元素組合起來比較

#因為採用遞迴形式,因此分為兩種情況,第二個字元是*

#第二個字元不是*(又包括只有乙個字元和第二個字元不是*兩種情況)

#先處理特殊情況

if not p: #包括p為none和p的長度為0兩種情況

return not s #若s也為空則匹配,否則不匹配

#第乙個字元匹配,因為此時p不為空,所以s也不能為空

#或者等於p[0],或者為『.』

first_match = bool(s) and p[0] in (s[0],'.')

if len(p) >= 2 and p[1]=='*':

#第二個字元是*時,他前面的字母可以出現0次,此時只需要直接把*和前面的字元去掉遞迴即可

#或者是它前面的字元出現好多次,此時只要第乙個字元匹配,然後每次去掉乙個s的字母與原來的模式p匹配即可

return self.ismatch(s,p[2:]) or (first_match and self.ismatch(s[1:],p))

else:

#p的長度為1(因為0已經在最開始排除) 或者第二個字元不是*

#與沒有*時一樣,只要第乙個一樣,然後去掉首字母後在比較,都相等則匹配

return first_match and self.ismatch(s[1:],p[1:])

LeetCode題目以及答案 10

題目 給乙個非負整數 num,反覆新增所有的數字,直到結果只有乙個數字。例如 設定 num 38,過程就像 3 8 11,1 1 2。由於 2 只有1個數字,所以返回它。高階 你可以不用任何的迴圈或者遞迴演算法,在 o 1 的時間內解決這個問題麼?思路 巢狀兩次迴圈即可 usr bin env py...

leetcode之排序題目總結

之前總結過排序的方法,在這裡在寫一下快速排序。快速排序的本質就是分治演算法,先找到該元素的正確位置,然後再將兩邊的元素遞迴進行快速排序。如下 int partition vector nums,int left,int right nums left nums right while left nu...

離散題目10

離散題目10 time limit 1000ms memory limit 65536kb submit statistic problem description 給定乙個數學函式f和兩個集合a,b,寫乙個程式來確定函式是滿射。如果每個可能的像至少有乙個變數對映其上 即像集合b中的每個元素在a中都...