劍指 Offer 19 正規表示式匹配

2021-10-09 03:57:43 字數 1558 閱讀 6346

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

示例 1:

輸入:s = 「aa」

p = 「a」

輸出: false

解釋: 「a」 無法匹配 「aa」 整個字串。

示例 2:

輸入:s = 「aa」

p = 「a*」

輸出: true

解釋: 因為 『*』 代表可以匹配零個或多個前面的那乙個元素, 在這裡前面的元素就是 『a』。因此,字串 「aa」 可被視為 『a』 重複了一次。

示例 3:

輸入:s = 「ab」

p = 「."

輸出: true

解釋: ".」 表示可匹配零個或多個(』*』)任意字元(』.』)。

示例 4:

輸入:s = 「aab」

p = 「cab」

輸出: true

解釋: 因為 『*』 表示零個或多個,這裡 『c』 為 0 個, 『a』 被重複一次。因此可以匹配字串 「aab」。

示例 5:

輸入:s = 「mississippi」

p = 「misisp*.」

輸出: false

s 可能為空,且只包含從 a-z 的小寫字母。

p 可能為空,且只包含從 a-z 的小寫字母以及字元 . 和 ,無連續的 '』。

注意:本題與主站 10 題相同:

通過次數18,930提交次數53,526

思路:動態規劃

首先確定動態規劃的狀態:對於dp[i][j]而言,表示主串s的前i個字元能否與模式串p前j個字元相匹配。那麼考慮如下幾種情況:

如果s[j-1]不是*:如果此時的s[i-1]和p[j-1]能夠匹配,那麼此時的dp[i][j]的值就等於dp[i-1][j-1];如果不能匹配則為false;

如果s[j-1]等於*,此時需要繼續考慮如下幾種情況:

*和其之前的字元不進行匹配,*代表0,那麼此時的

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

如果*進行匹配,那麼需要比較s[i-1]和p[j-2]是否能夠匹配,如果能夠匹配,dp[i][j] = dp[i-1][j],意思就是主串往前移動一步。

對於初始值,需要進行特殊的考慮,s和p均為0的時候,能夠匹配;p為0但是s不為0的時候不能夠匹配;其他情況需要進行計算得到;

class

solution

if(p[j-1]

!='*')}

else

if(i>=

1&&j>=2&&

(p[j-2]

==s[i-1]

||p[j-2]

=='.'))

}//cout}return dp[n]

[m];}}

;

劍指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可以出現任...