LeetCode刷題筆記 32 最長有效括號

2021-10-05 01:15:54 字數 1014 閱讀 9112

題目:

給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。

示例 1: 輸入: 「(()」 輸出: 2 解釋: 最長有效括號子串為 「()」

示例 2: 輸入: 「)()())」 輸出: 4 解釋: 最長有效括號子串為 「()()」

題解:

定義乙個 dp 陣列,其中第 i 個元素表示以下標為 i 的字元結尾的最長有效子字串的長度。可知dp[0]=0,且位置處字元為『(』的dp均為0,所以只需要考慮字元為『)』的情況:

當掃瞄到i處為「)」時,如果i-1處為「(」那麼dp[i]=dp[i-2]+2;

當掃瞄到i處為「)」時,如果i-1處為「)」,即「…))」,如果在這一串字元之前有乙個(,即「(…))」即 s[i - dp[i - 1] - 1] == 『(』,那麼dp[i] = dp[i − 1] + dp[i − dp[i − 1] − 2] + 2。

因為如果倒數第二個 )是乙個有效子字串的一部分(記為subs),我們此時需要判斷 subs 前面乙個符號是不是 ( ,如果恰好是(,我們就用 subs 的長度(dp[i - 1)加上 2 去更新 dp[i]。除此以外,subs在前乙個是「(」的情況下有可能和另乙個有效字串合併成更大的有效字串。 dp[i − dp[i − 1] − 2] 表示 以subs之前兩個字元,也就是「(」之前乙個字元,為字元結尾的最長有效字串的長度。

邊界情況:

i - 2 有可能小於零越界了,這種情況下就是只有 () ,前面記為 0 就好了.

i - dp[i - 1] - 1 和 i - dp[i - 1] - 2 都可能越界,越界了當成 0 來計算就可以了.

**:

class

solution

max_len=math.

max(max_len,dp[i]);

}}return max_len;

}}

官方題解

Leetcode刷題筆記

1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...

LeetCode刷題筆記

實現strstr 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 haystack aaaa...

LeetCode刷題筆記

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 ...