力扣32.最长有效括号(简单易懂)

27 阅读1分钟

题目如图所示:

image.png

我们可以用栈去判断字符串每个位置是否是有效的,有效就用数组标记为1 不有效就为0,然后最后通过数组去找出最长连续为1的子串就行

  • 例如: "()(()"的mark为[0, 0, 1, 0, 0]
  • 再例如: ")()((())"的mark为[1, 0, 0, 1, 0, 0, 0, 0]
  • 经过这样的处理后, 此题就变成了寻找最长的连续的0的长度
    public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack();
        int n = s.length();
        int[] valid = new int[n];
        int ans = 0;
        for(int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if(ch == '(')
            stack.push(i);
            else {
                if(!stack.isEmpty()) {
                    int index = stack.pop();
                    valid[i] = 1;
                    valid[index] = 1;
                }
            }
        }
        int sum = 0;
        for(int i = 0; i < n; i++) {
            if(valid[i] == 1) {
              sum += 1;
              ans = Math.max(ans,sum);
            } else 
            sum = 0;
        }
        return ans;
    }
}