劍指 Offer 19 正規表示式匹配C

2021-10-17 03:26:36 字數 1245 閱讀 3577

還債第一題

做過幾題dp的話,應該可以猜測出dp方程的含義,但是dp方程以及初始化都是本題的難點。

dp陣列含義

dp[i][j] :s的前i個字元和p的前j個字元是否可以匹配。可見只有兩種取值,但是經驗告訴我們,用int比bool快。

dp方程

也就是本題最難的地方了,我們觀察的角度是從p的最後乙個字元出發(怎麼想到從p的最後乙個字元出發呢?這就是和大佬實力的差距了 )。分為三種情況

初始值

這裡有個特殊的技巧,將dp的行和列的長度多加1,這樣能方便討論空串的情況:即dp[0][n]和dp[n][0]

class

solution

else

//p[j - 1] =='*' 注意兩者擇一即可,不是你死我活的關係

else

} cout<<

"["<

"]"<<

"["<

"]"<<

"="<

[j]<

}return dp[len1]

[len2];}

};

關於*的情況再舉乙個例子

比如「a a a」

「a b * a * c * a」

這裡的dp[3][8] = dp[2][7] = dp[2][5]

dp[2][5] 的情況下

「a a」

"a b * a * "

如果我們只選擇用a來匹配,

dp[2][5]= dp[1][5] = dp[0][5] = dp[0][3] = dp[0][1] = 0很明顯得到了錯誤答案

但是如果我們選擇可以忽視a

dp[2][5] = dp[1][5] = dp[1][3] = dp[1][1] = 1 得到正確的答案

時間複雜度o(mn)

空間複雜度o(mn)

劍指Offer 19 正規表示式匹配

之前做這個題的時候特別凌亂,但這次會好很多,把思路分享出來,以及邊界的確定 思路 我們用倆個索引來控制字串和模式串已經匹配到達的位置,index1和index2,這個問題就難在有 的位置,我們需要考慮下乙個位置為 時候怎麼處理 1.模式串的index2下乙個位置為 1 字串的index1位置與模式串...

劍指offer19 正規表示式匹配

2.如果第二位是 第一位如果匹配,則三種情況 有一種為true,則結果為true 3.其餘情況一位一位比較 class solution s,pattern都是字串 defmatch self,s,pattern write code hereif len s 0 andlen pattern 0 ...

劍指offer 19 正規表示式匹配

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