LeetCode刷題系列 10

2021-10-24 12:02:12 字數 2307 閱讀 8890

給你乙個字串s和乙個字元規律p,請你來實現乙個支援'.''*'的正規表示式匹配。

'.' 匹配任意單個字元

'*' 匹配零個或多個前面的那乙個元素

所謂匹配,是要涵蓋整個字串s的,而不是部分字串。

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

p可能為空,且只包含從a-z的小寫字母,以及字元.*

示例 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 = "c*a*b"

輸出: true

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

示例 5:

輸入:

s = "mississippi"

p = "mis*is*p*."

輸出: false

題目所述的正則匹配適合從尾部到頭部開始,而尾部的p字元在試圖匹配s中尾部的字元的時候如果是非『*』字元,那麼統一單個匹配,然後最終結果和前面的匹配結果綜合考慮;如果是『*』字元的話,會有多種匹配方式,即有幾種可能性。

對於此題,我們有如下的狀態轉移方程:

]指:p從第0個字元到第j個字元能否匹配從s[0]到s[i]的字元

f [i

][j]

f[i][j]

f[i][j

]為true需要滿足幾個條件:

如果p[j]*之外的字元,那麼必須是當p[j] == s[i],且f[i-1][j-1] == true,即確保當前字元匹配的情況下,前面的所有字元都是匹配的才能使f[i][j]true,否則為false如果p[j]*字元的話,那麼就會有很多可能性考慮:

a. 可以視作0匹配,即*字元以及其前面的乙個字元都是無效的,匹配了0個字元。此時需要滿足f[i][j-2]true,即p[j-2]之前的字串能匹配s[0]到s[i]的字元

b.可以視作乙個或多個匹配。此時必須滿足p[j-1]能匹配s[i],此時的p[0]到p[i]的字串可以進行多次匹配,因此其匹配結果f[i][j]取決於f[i-1][j]

單個字元的匹配方法為:

動態規劃方法的邊界條件是f[0][0],因為空字串可以匹配空字串,因此為true

class

solution

bool

ismatch

(string s, string p)

}else}}

}return f[m]

[n];}}

;

LeetCode刷題系列10

給你乙個字串 s 和乙個字元規律 p,請你來實現乙個支援 和 的正規表示式匹配。匹配任意單個字元 匹配零個或多個前面的那乙個元素 所謂匹配,是要涵蓋 整個 字串 s的,而不是部分字串。說明 s 可能為空,且只包含從 a z 的小寫字母。p 可能為空,且只包含從 a z 的小寫字母,以及字元 和 示例...

leetcode刷題系列

題目 輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。解題思路 如果乙個整數不為0,那麼這個整數至少有一位是1。如果我們把這個整數減1,那麼原來處在整數最右邊的1就會變為0,原來在1後面的所有的0都會變成1 如果最右邊的1後面還有0的話 其餘所有位將不會受到影響。舉個例子 乙個二進...

LeetCode刷題系列1

給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...