最長有效括號

2021-10-09 07:38:47 字數 2131 閱讀 7136

題目描述

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

示例 1:

輸入: "(()"

輸出: 2

解釋: 最長有效括號子串為 "()"

示例 2:

輸入: ")()())"

輸出: 4

解釋: 最長有效括號子串為 "()()"

動態規劃

還是老問題:為什麼要用動態規劃?假如說str[i] == ')',我們就要往字串前面去尋找,有沒有能匹配該')''(',那麼需要往前走多少步?前面的有效括號長度是多少,這都不得而知,所以我們需要以str[i]結尾的最長有效括號長度記錄下來,這樣計算以str[i]結尾的最長有效括號長度時可以直接拿來用

我感覺我摸出套路來了,我們定義dp[i]的含義為:以str[i]結尾的最長有效括號長度,對於以(結尾的字串,因為'('無法閉合,所以dp[i]永遠等於0;對於以')'結尾的字串,我們還需要分情況判斷

')'結尾的字串,即str[i] == ')'

如果str[i-1] == '(',則說明與'('配對的'('就在其左邊,配對成功,但是這樣還不行,我們還需要加上str[i-2]結尾的最長有效括號長度(dp[i-2],當然前提是i-2不會造成陣列越界),這樣才能算是以str[i] == ')'結尾的最長有效括號長度

如果str[i-1] == ')',那麼我們需要往左去尋找與'('匹配的')',因為dp[i-1]儲存的是以str[i-1]結尾的最長有效括號長度,所以我們需要往左找到i-dp[i-1]-1的位置,如果str[i-dp[i-1]-1] == '(',則證明匹配成功(前提是i-dp[i-1]-1沒有造成陣列越界),同樣,我們還需要加上以str[i-dp[i-1]-1-1]結尾的最長有效括號長度(dp[i-dp[i-1]-2],當然前提是i-dp[i-1]-2不會造成陣列越界)

當我們知道字串中所有以str[i]結尾的最長有效括號長度(i0~str.length-1),再從其中選出最大值,即為整個字串的最長有效括號

**

class

solution

int[

] dp =

newint

[str.

length()

];// 單個字元的最長有效括號長度為 0

dp[0]

=0;// 預設最長有效括號長度為 0

int maxlength =0;

// 以字串中每個字元作為結尾,判斷以 str[i] 結尾的最長有效括號長度

for(

int i =

1; i < str.

length()

; i++

)else

}else

else}}

}}// 動態記錄整個字串的最長有效括號長度

maxlength = math.

max(dp[i]

, maxlength);}

return maxlength;

}}

最長有效括號

leedcode32 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2解釋 最長有效括號子串為 示例 2 輸入 輸出 4解釋 最長有效括號子串為 思路 首先生成乙個長度和s一樣的陣列dp,dp i 表示以i結尾的字元的最長有效括號子串長度。顯然dp 0 0 假...

最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2解釋 最長有效括號子串為 示例 2 輸入 輸出 4解釋 最長有效括號子串為 思路 解法1 借助棧 借助棧來求解,需要定義個start變數來記錄合法括號串的起始位置,我們遍歷字串,如果遇到左括號,則將當前下標壓入棧...

最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。輸入 輸出 2 解釋 最長有效括號子串為 輸入 輸出 4 解釋 最長有效括號子串為 用陣列dp i 表示括號串s i 結尾的最大括號字串長度。當 s i 是 時,dp i 一定為0。當s i 為 時,判斷s i 1 是否為 s i 1 ...