- 最长有效括号
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
题解一:利用栈的思想
利用栈的思想,不过这道题有点特殊,一般栈只能用来判断"(())“这种情况, 但是不能判断”()()"这种,会漏掉之前的完整括号,所以利用一点技巧,保证栈底是最后一个未匹配的右括号(第一个用-1代替),每次左括号是跟栈底元素进行相减
class Solution {
/**
利用栈的思想,不过这道题有点特殊,一般栈只能用来判断"(())"这种情况
但是不能判断"()()"这种,会漏掉之前的完整括号,所以利用一点技巧,保证栈底是最后一个未匹配的右括号
(第一个用-1代替),每次左括号是跟栈底元素进行相减
*/
public int longestValidParentheses(String s) {
int low=0;
int high=0;
int max=0;
int len=s.length();
Stack<Integer> stack=new Stack<>();
stack.push(-1);
for(int i=0;i<len;i++){
if(s.charAt(i)=='('){
stack.push(i);
}
else{
stack.pop(); //进来先弹出栈顶元素,与下一个元素相减才是真正的字符串长度
if(stack.isEmpty()){
stack.push(i);
}
else{
int newLen=i-stack.peek();
if(max<newLen){
max=newLen;
}
}
}
}
return max;
}
}
题解二
统计左括号和右括号的个数,如果相等则记录长度,如果右括号多于左括号,则清零重新统计,但是有一种情况统计不了,就是"(()",需要从右到左再遍历一次,相同方式再记录最大长度,取两次统计的较大者
class Sulution{
public int longestValidParentheses(String s){
int left=0;
int right=0;
int len=s.length();
int max=0;
for(int i=0;i<len;i++){
if(s.charAt(i)=='('){
left++;
}
else{
right++;
}
if(right>left){
left=right=0;
}
else if(left==right){
if(max<2*left){
max=2*left;
}
}
}
left=0;
right=0;
for(int i=len-1;i>=0;i--){
if(s.charAt(i)=='('){
left++;
}
else{
right++;
}
if(left>right){
left=0;
right=0;
}
else if(left==right){
if(max<left*2){
max=left*2;
}
}
}
return max;
}
}