題目:
請實現乙個函式用來匹配包括』.』和』『的正規表示式。模式中的字元』.』表示任意乙個字元,而』『表示它前面的字元可以出現任意次(包含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 均不匹配.分析 觀察模式串中第...