給你乙個字串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 ...