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;
}
}