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;
        }
    }
  • 相关阅读:
    使用DOM4J生成XML文档的分析和简单实例
    察看数据库索引使用情况
    SQL Server分布式事务模板
    SQLBulkCopy 性能统计
    个人技术发展思路
    在SQLServer 中利用OUTPUT 语句实现删除数据的同时备份数据
    对一段SQL进行语法检查
    LoD 迪米特法则
    开发心得
    实现一个服务的基础结构和管理本地服务和WCF服务的管理器
  • 原文地址:https://www.cnblogs.com/xiaona-/p/12750315.html
Copyright © 2011-2022 走看看