题目:最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
答案
class Solution {
public int longestValidParentheses(String s) {
int len = s.length();
//使用left记录左括号个数,使用right记录右括号个数,ans记录最长有效个数
int left=0,right=0,ans=0;
//若括号有效,则左括号和右括号一定相等,且有效括号一定以左括号开始。
//所以排除括号由右括号开始的情况,即排除当右括号的个数大于左括号时的情况
//当左括号与右括号相等时,将当前的有效个数与ans相比,取最大值。
//当右括号的个数大于左括号时,将right和left清零,从下一个字符重新开始计算
//但这样会排除如“(()”的情况,所以将字符串S反过来从len-1再遍历一遍即可获得全部答案
for (int i=0;i<len;i++){
if (right>left){
right=0;
left=0;
}
if (s.charAt(i)=='('){
left++;
}else {
right++;
}
if (left>0 && right==left){
ans=Math.max(ans,left*2);
}
}
left=0;right=0;
for (int i=len-1;i>0;i--){
if (right<left){
right=0;
left=0;
}
if (s.charAt(i)==')'){
right++;
}else {
left++;
}
if (left>0 && right==left){
ans=Math.max(ans,left*2);
}
}
return ans;
}
}