棧 以後碰到解決成對出現的字符
給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串爲 "()"
示例 2:
輸入: ")()())"
輸出: 4
解釋: 最長有效括號子串爲 "()()"
思路分析:
解題思路:棧 以後碰到解決成對出現的字符
1.需有一個變量start記錄有效括號子串的起始下標,max表示最長有效括號子串長度,初始值均爲0
2.遍歷給字符串中的所有字符()
2.1若當前字符s[index]爲左括號'(',將當前字符下標index入棧(下標稍後有其他用處),處理下一字符
2.2若當前字符s[index]爲右括號')',判斷當前棧是否爲空
2.2.1若棧爲空,則start = index + 1(有效括號子串的起始下標+1),處理下一字符(當前字符右括號下標不入棧)
2.2.2若棧不爲空,則出棧(由於僅左括號入棧,則出棧元素對應的字符一定爲左括號下標,可與當前字符右括號配對),判斷棧是否爲空
2.2.2.1若棧爲空,則max = max(max, index-start+1)
2.2.2.2若棧不爲空,則max = max(max, index-棧頂元素值)
總結:2.1處理左括號分支; 2.2處理右括號分支。
總是遇到左括號下標入棧(右括號不入棧)。
遇到右括號去判斷棧裏是否有左括號,棧爲空(不存在‘(’)就有效括號子串的起始下標後移一位,繼續當前起始下標位置判斷;棧不爲空,就出棧(移除‘(’,這個是右括號分支,配對‘()’,出棧了)。
在出棧後還得判斷是否棧空來計算有效括號長度
class Solution {
public int longestValidParentheses(String s) {
//max是返回的有效長度,start是有效的括號起始下標,即()
int max = 0, start = 0;
if(null == s) return 0;
int len = s.length();
Stack<Integer> stack = new Stack<>();
for(int index = 0; index < len; index++){
//遇左括號(,壓棧(棧中元素爲當前位置所處的下標)
if('(' == s.charAt(index)){
stack.push(index);
} else {
//棧爲空就說明棧裏沒有'(',起始下標後移
if(stack.isEmpty()){
start = index+1;
} else {
//棧非空就存在'(',此時與右括號分支中')'匹配,出棧
stack.pop();
//出棧後再次判斷棧是否爲空,來計算有效括號長度
if(stack.isEmpty()){
max = Math.max(max, index-start+1);
} else {
max = Math.max(max, index-stack.peek());//stack.peek()得到棧頂元素,但是不刪除棧頂元素
}
}
}
}
return max;
}
}