設dp[i]表示以下標i的半括號結尾的最長有效括號長度。設s為字串,s[i]只能為)才能結尾,否則dp[i]=0。
當s[i]=)且s[i-1]=(時,dp[i]=dp[i-2]+2。
當s[i]=)且s[i-1]=)時,則在前面必有乙個(與s[i]對應,它的位置在s[ i-1-dp[i-1] ]。因此當s[i]=)且s[i-1]=)且s[ i-1-dp[i-1] ]=(時:
dp[i]=dp[i-1]+2+dp[ i-1-dp[i-1]-1 ]
需注意最後一項,它表示將與s[i]對應的左括號之前已存在的有效括號加上
初始時將dp陣列初始化為0,需注意前兩個字元的特殊情況,當s[0]=(且s[1]=)時,需將dp[1]設為2,否則dp[1]在之後的迴圈中不會更新
class
solution
for( i=
0;ielse
if( i-
1>=
0&& s[i]
==')'
&& s[i-1]
==')')}
}return maxx;}}
;
由於只需求最長有效括號串的長度,因此我們只需將下標入棧。我們的想法是:每遇到左括號,將其入棧,每遇到右括號,將棧頂左括號出棧,根據它的下標計算有效括號串長度,即當前下標-出棧元素下標+1
考慮以下情況:
我們會發現乙個問題:遍歷到下標為5的元素時,計算出的長度為5-2+1=4,最前面的兩個元素不在棧中,被忽略掉了;
我們需要最前面的括號串留下它的痕跡,為此我們需要修改計算有效括號串長度的規則,我們需要將每個有效括號串前面的乙個字元作為標識壓入棧中
我們引入墊底下標解決該問題,在初始棧時將-1 push進去,計算長度的規則變為:當前下標-出棧後的棧頂元素下標。
墊底下標是需要更換的,當棧中只有乙個元素,即墊底元素時,若當前遍歷到的為),如下標為6的元素,表示前面的有效字串已結束,此時將當前下標作為墊底元素壓入棧中
class
solution
else
else}}
return maxx;}}
;
對於每個有效括號串,其左括號個數一定等於右括號個數。 我們用left記錄左括號個數,用right記錄右括號個數,從左到右遍歷字串,若右括號個數已經大於左括號個數,則不可能構成有效括號串,將left和right賦為0。若left==right,則更新最長括號串長度
但這樣我們會發現乙個問題,若左括號數大於右括號數,但已經不可能成為有效括號串的情況,如((),我們從左到右遍歷時會認為它仍有可能成為有效括號,因此無法排除這種情況
因此我們再進行反向遍歷解決該問題,不過反向遍歷時,若左括號數已經大於右括號數,將left和right重置為0
class
solution
else
if( left
else
if( left==right )
} left=0;
right=0;
for( i=n-
1;i>=
0;i--
)else
if( left>right )
else
if( left==right )
}return maxx;}}
;
最長有效括號
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 ...