zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    使用::befor和::after伪元素在网站中添加图标
    使用LESS对CSS进行预处理
    window.innerWidth和document.body.clientWidth的区别
    javascript原型链继承
    javascript中的类型检测
    ASP.NET网站报Service Unavailable错误的解决办法
    在ASP.NET MVC中使用UEditor无法提交的解决办法
    EasyUI DataGrid设置列宽为百分比导致表头和内容错位的解决方法
    使用JS读取本地文本文件(兼容各种浏览器)
    美化上传文件按钮
  • 原文地址:https://www.cnblogs.com/xiaona-/p/12750315.html
Copyright © 2011-2022 走看看