LeetCode32.最长有效括号

133 阅读2分钟

通常这个题可以使用栈的方式,由于篇幅原因,这边不贴栈的代码,讲一下思路。另外一种方法就是计数器法,这个方法是我看了leetcode官方解答之后写的,思路清奇,值得学习。

思路

与找到每个可能的子字符串后再判断它的有效性不同,我们可以用栈在遍历给定字符串的过程中去判断到目前为止扫描的子字符串的有效性,同时能的都最长有效字符串的长度。

我们首先将 -1 放入栈顶。 

对于遇到的每个 '(',我们将它的下标放入栈中。 

对于遇到的每个 ')' ,我们弹出栈顶的元素并将当前元素的下标与弹出元素下标作差,得出当前有效括号字符串的长度。

通过这种方法,我们继续计算有效子字符串的长度,并最终返回最长有效子字符串的长度。 

计数器

就是使用两个计数器从左到右遍历,当计数器相同时就满足了匹配成功的条件,每次相同时都需要记录当前值,如果右计数器大于左计数器,则全部置0,最终取最大长度记录。再从右往左遍历,以相同的方式求最大长度。

详细代码如下:

import java.util.*;
class Solution {
    public int longestValidParentheses(String s) {
        //设置两个计数器和结果值
        int left=0,right=0,maxLength=0;
        int length = s.length();
        //从左到右遍历
        for(int i=0;i<length;i++){
            if(s.charAt(i)=='('){
                left++;
            }else{
                right++;
            }
            if(left==right){
                maxLength=Math.max(maxLength,2*left);
            }
            if(left<right){
                left=0;
                right=0;
            }
        }
        //从右往左遍历
        left=0;right=0;
        for(int i=length-1;i>=0;i--){
            if(s.charAt(i)==')'){
                right++;
            }else{
                left++;
            }
            if(left==right){
                maxLength=Math.max(maxLength,2*right);
            }
            if(left>right){
                left=0;
                right=0;
            }
        }
        return maxLength;
    }

}