劍指offer 正規表示式的字串匹配。

2021-08-17 02:50:12 字數 1489 閱讀 8210

題目:

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

思路:動態規劃,設dp[j][i] 為pattern前j個模式是否與s前i個相匹配的真值,即pattern[0…j-1]與s[0…i-1]匹配,則dp[j][i]為真,否則為假。

dp下標為j,i時,

當pattern[j-1]與s[i-1]相匹配,即pattern[j-1]==s[i-1] or pattern[j-1]==』.』時,dp的真值取決於dp[j-1][i-1],即前j-1個pattern,與前i-1個s是否相匹配。

當pattern[j-1]與s[i-1]不匹配,且 pattern[j-1]==』*』 ,這時可以分為『*』前的乙個字元是否與s[i-1]匹配。

不匹配,意味著 pattern[j-2]!=s[i-1]且pattern[j-2]!=』.』,dp[j][i]=dp[j-2][i],即取決於pattern開始到『*』前兩個字元與s[0…,i-1]是否匹配。

匹配,意味著pattern[j-2]==s[i-1]或pattern[j-2]==』.』,dp[j][i]=dp[j-1][i] or dp[j][i-1] or dp[j-2][i] ,即dp[j][i]取決於pattern[0…j-2]與s[0…i-1]是否匹配(a*匹配乙個)和pattern[0…j-1]與s[0..i-2]是否匹配(a*匹配多個)以及pattern[0..j-2]與s[0…i-1]是否匹配(a*匹配0個)。

class

solution:

# s, pattern都是字串

defmatch

(self, s, pattern):

# write code here

ls=len(s)

lp=len(pattern)

dp=[[false]*(ls+1) for _ in range(lp+1)]

dp[0][0]=true

for j in range(1,lp+1):

if pattern[j-1]=='*':

dp[j][0]= dp[j-2][0]

for i in range(1,ls+1):

for j in range(1,lp+1):

if pattern[j-1]==s[i-1] or pattern=='.':

dp[j][i]=dp[j-1][i-1]

else:

if pattern[j-1]!=s[i-1] and pattern != '.':

dp[j][i]=dp[j-2][i]

else:

dp[j][i]=dp[j-2][i] or dp[j-1][i] or dp[j][i-1]

return dp[lp][ls]

劍指offer 正規表示式匹配

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

劍指Offer 正規表示式匹配

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

劍指offer 正規表示式匹配

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