leetcode_32.最长有效括号

最长有效括号

1.题目

  题目链接:https://leetcode-cn.com/problems/longest-valid-parentheses/

  题目截图

  

解法一:

2.大致思路

  对于括号配对的问题,很自然的就可以想到利用栈来解决。利用的数据结构是栈。

  例如对于输入“)()())”,从头扫描字符串,如果遇到的是“(”则使其入栈,如果遇到的是“)”则与栈顶元素进行比对,如果配对成功则消去这两个字符,否则入栈。这里计算最长有效括号的长度就是用消去之前的栈顶元素-消去之后的栈顶元素。

  示例:

  

3.相关代码(java)  

class Solution {
    public int longestValidParentheses(String s) {
        //如果栈为空或者输入的字符串长度为0,那么肯定输出为0
        if (s == null || s.length() == 0) {
            return 0;
        }

        int n = s.length();//n用于记录字符串的长度

        char[] sArr = s.toCharArray();//将字符串转换为字符数组的形式,便于对其进行遍历
        Stack<Integer> stack = new Stack<>();//定义一个栈

        int result = 0;//利用result来记录有效括号的长度

        // 在开始扫描前先将-1入栈
        stack.push(-1);

        for (int i = 0; i < n; ++i) {
            //遇到“)”时,栈不为空并且栈顶元素为“(”,进行的操作便是栈顶出栈进行配对,并记录最长有效括号的长度  
            if (sArr[i] == ')' && stack.size() > 1 && sArr[stack.peek()] == '(') { 
                stack.pop(); 
         result = Math.max(result, i - stack.peek()); }
else { stack.push(i); } } return result; } }

 解法二:

2.大致思路

  利用两个变量,left和right分别表示左括号和右括号的出现次数。从左向右扫描遇到左括号时left+1,遇到右括号时right+1。当left==right时说明为有效括号,记录当前有效括号的长度;当右括号数量超过左括号时是一定不能组成有效括号的,此时left和right重置为0。

  为了避免“(()”这样的情况,可以进行反向遍历来处理。

3.相关代码(java)

class Solution {
    public int longestValidParentheses(String s) {
        int left=0,right=0,maxlength=0;

        //从左向右
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='(')
                left++;
            else
                right++;
            if(left==right){
                maxlength=Math.max(maxlength,2*right);
            }
            else if(right>=left){
                left=right=0;
            }
        }

        left=right=0;
        //从右到左
        for(int i=s.length()-1;i>=0;i--){
            if(s.charAt(i)=='(')
                left++;
            else
                right++;
            if(left==right){
                maxlength=Math.max(maxlength,2*left);
            }
            else if(right<=left){
                left=right=0;
            }
        }
        return maxlength;
    }
}

 

posted @ 2020-04-22 10:27  飞鸟迷失天空  阅读(201)  评论(0编辑  收藏  举报