leetcode習題集 10 正規表示式匹配

2021-09-12 08:30:53 字數 1775 閱讀 4816

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