1 題目描述
給定一個只包含 ‘(’ 和 ‘)’ 的字符串,找出最長的包含有效括號的子串的長度。
示例 1:
輸入: “(()”
輸出: 2
解釋: 最長有效括號子串爲 “()”
示例 2:
輸入: “)()())”
輸出: 4
解釋: 最長有效括號子串爲 “()()”
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 方法一:暴力法
java 運行不通過超時應該 複雜度太高
在這種方法中,我們考慮給定字符串中每種可能的非空偶數長度子字符串,檢查它是否是一個有效括號字符串序列。
爲了檢查有效性,我們使用棧的方法。
- 方法二:棧
1、首先,棧底永遠保存着當前有效子串的前一個字符的下標,就像個守門員一樣守在那裏,所以一開始要將-1放入棧中。
2、遇到左括號就入棧;
3、遇到右括號就將棧頂元素出棧。此時有兩種情況:
(1)如果棧頂元素出棧後,棧內剩下的元素不爲空,則說明彈出的這個棧頂元素一定是左括號,講真,因爲棧底有保險。
(2)如果棧頂元素出棧後,棧內爲空,則說明剛剛彈出的這個棧頂元素就是之前的“有效子串前一位的字符下標”,守門員都沒了,所以此時應該使用當前的右括號的下標入棧,更新這個“有效子串前一位的字符下標”。
3 解決代碼
- 方法一:暴力法 《Java代碼》
//java 運行不通過超時應該 複雜度太高
public class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push('(');
} else if (!stack.empty() && stack.peek() == '(') {
stack.pop();
} else {
return false;
}
}
return stack.empty();
}
public int longestValidParentheses(String s) {
int maxlen = 0;
for (int i = 0; i < s.length(); i++) {
for (int j = i + 2; j <= s.length(); j+=2) {
if (isValid(s.substring(i, j))) {
maxlen = Math.max(maxlen, j - i);
}
}
}
return maxlen;
}
}
作者:LeetCode
鏈接:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
- 方法二:棧《Java代碼》
class Solution {
public int longestValidParentheses(String s) {
int max_len = 0;
Stack<Integer> stack = new Stack<>();
stack.push(-1);
for(int i = 0; i < s.length(); i++){
//爲左括號的話,把下標入棧
if(s.charAt(i) == '('){
stack.push(i);
}
//爲右括號的話,出棧
else{
stack.pop();
//棧內爲空,更新下標
if(stack.empty()){
stack.push(i);
}
else{
//不爲空,更新最大的長度
max_len = Math.max(max_len, i - stack.peek());
}
}
}
return max_len;
}
}