題目
給定一個只包含 '('
和 ')'
的字符串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: "(()"
輸出: 2
解釋: 最長有效括號子串爲 "()"
示例 2:
輸入: ")()())
" 輸出: 4 解釋: 最長有效括號子串爲"()()"
思路
掃描一遍,借用棧,將所有匹配的括號的索引處 全部置字符'0'
例如: "()(()"的mark爲【 0, 0, (, 0, 0 】
再例如: ")()((())"的mark爲【 ), 0, 0, (, 0, 0, 0, 0 】
經過這樣的處理後, 此題就變成了尋找最長的連續的0的長度
解答1:
/*
掃描一遍,借用棧,將所有匹配的括號的索引處 全部置字符'0'
例如: "()(()"的mark爲【 0, 0, (, 0, 0 】
再例如: ")()((())"的mark爲【 ), 0, 0, (, 0, 0, 0, 0 】
經過這樣的處理後, 此題就變成了尋找最長的連續的0的長度
*/
public int longestValidParentheses(String s) {
char[] charArr = s.toCharArray();
Stack<String> stack = new Stack<>();
for (int i = 0; i < charArr.length; i++) {
char ch = charArr[i];
// 如果是左括號,則把括號和索引壓棧
if (ch == '(') {
stack.push(ch + "_" + i);
}
// 如果是右括號,並且棧頂也是左括號
if (ch == ')' && !stack.isEmpty() && stack.peek().startsWith("(")) {
String tmpStr = stack.peek();
stack.pop();
// 那麼:右括號所在索引位置 元素置0
String[] tmpArr = tmpStr.split("_");
int tmpIndex = Integer.parseInt(tmpArr[1]);
charArr[tmpIndex] = '0';
// 當前的索引也置0
charArr[i] = '0';
}
}
// 遍歷數組,統計最長連續的 ‘0’
int result = 0;
int k = 0;
for (int i = 0; i < charArr.length; i++) {
if (charArr[i] == '0') {
k++;
result = Math.max(result, k);
} else {
k = 0;
}
}
return result;
}
解答2:動態規劃