題目描述給定乙個只包含
'('
和')'
的字串,找出最長的包含有效括號的子串的長度。
示例 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]
結尾的最長有效括號長度(i
為0~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 ...