給定乙個字串 (s) 和乙個字元模式 §。實現支援 『.』 和 『*』 的正規表示式匹配。
『.』 匹配任意單個字元。
『*』 匹配零個或多個前面的元素。
匹配應該覆蓋整個字串 (s) ,而不是部分字串。
說明:s 可能為空,且只包含從 a-z 的小寫字母。
p 可能為空,且只包含從 a-z 的小寫字母,以及字元 . 和 *。
示例 1:輸入:s = 「aa」
p = 「a」
輸出: false
解釋: 「a」 無法匹配 「aa」 整個字串。
示例 2:輸入:s = 「aa」
p = "a * "
輸出: true
解釋: 『*』 代表可匹配零個或多個前面的元素, 即可以匹配 『a』 。因此, 重複 『a』 一次, 字串可變為 「aa」。
示例 3:輸入:s = 「ab」
p = ". * "
輸出: true
解釋: " . * " 表示可匹配零個或多個(』*』)任意字元(』.』)。
示例 4:輸入:s = 「aab」
p = 「c * a * b」
輸出: true
解釋: 『c』 可以不被重複, 『a』 可以被重複一次。因此可以匹配字串 「aab」。
示例 5:輸入:s = 「mississippi」
p = "mis * is * p * . "
輸出: false
public
class
p10_regularexpressionmatching
else}}
return m[sl]
[pl];}
}
思路,本題採用動態規劃演算法進行解題。
1.構造m[sl+1][pl+1]容量的布林陣列,m[i][j]表示s(0 ~ i-1)和 p(0 ~ j-1)是否匹配
分為兩種情況:
掃瞄p(j-1)即p的第j位為 『 * 』 時
『 * 』匹配了0次 m[i][j] = m[i][j-2],如下圖
『 * 』匹配了1次及以上,則必然有m[i][j] = m[i-1][j](若s[i-1]和p[j-1]匹配,去掉s中的這次匹配,原s[i-2]和p[j-1]仍然匹配),其中保證 s.charat(i-1) == p.charat(j-2) 或者 p.charat(j-2) == 『.』
掃瞄p(j-1)即p的第j位不為『 * 』時
保證s.charat(i-1) == p.charat(j-1) || p.charat(j-1) == 『.』
最後得出 m[sl][pl]即為s和p是否匹配
Leetcode習題集 鍊錶
這裡記錄一些我刷題的思路方便之後進行複習重溫,同時也方便進行新增 p141 環形鍊錶 class solution listnode reverse listnode head return pre 使用翻轉鍊錶,判斷返回的指標與傳進的指標是否相同,時間複雜度是o n 可能 空間複雜度是o 1 cl...
leetcode習題集 54 螺旋矩陣
給定乙個包含 m x n 個元素的矩陣 m 行,n 列 請按照順時針螺旋順序,返回矩陣中的所有元素。示例 1 輸入 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 示例 2 輸入 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1,2,3,4,8,12,11...
leetcode習題集 56 合併區間
給出乙個區間的集合,請合併所有重疊的區間。示例 1 輸入 1,3 2,6 8,10 15,18 輸出 1,6 8,10 15,18 解釋 區間 1,3 和 2,6 重疊,將它們合併為 1,6 示例 2 輸入 1,4 4,5 輸出 1,5 解釋 區間 1,4 和 4,5 可被視為重疊區間。public...