zoukankan      html  css  js  c++  java
  • leetcode刷题笔记三十二 最长有效括号

    leetcode刷题笔记三十二 最长有效括号

    源地址:32. 最长有效括号

    问题描述:

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

    示例 1:

    输入: "(()"
    输出: 2
    解释: 最长有效括号子串为 "()"
    示例 2:

    输入: ")()())"
    输出: 4
    解释: 最长有效括号子串为 "()()"

    代码补充:

    //看到本题的第一想法就是参考之前的有效括号的题目,使用stack解决括号
    //匹配问题
    //判断条件始终是')'
    //将堆栈压入'-1'作为标记
    //面对压入')'时,首先将栈顶元素弹出
    //如果栈目前括号时成对的  那么栈内存在"-1"标记 栈不为空
    //这时计算一下目前成对括号的下标差值 和之前差值进行比较取最大值
    //如果此时栈内为空,说明有不匹配的")"出现将-1弹出,这是需要更新
    //本次下标计算的起始位置
    //如果压入的是"(",将左括号的位置压入
    //如果有对应的右括号会被弹出
    //如果没有对应的右括号,则其会作为下次计算下标差值的起始位置
    import scala.collection.mutable.Stack
    import scala.math
    object Solution {
        def longestValidParentheses(s: String): Int = {
            if(s.length == 0 || s.length == 1) return 0
            val anStack = new Stack[Int]()
            var ans = 0
            anStack.push(-1)
            for (i <- 0 until s.length){
                if(s(i) == ')'){
                    anStack.pop()
                    if(anStack.isEmpty == false) {
                        val peek = anStack.pop()
                        println("peek: " + peek)
                        ans = Math.max(ans, i - peek)
                        anStack.push(peek)
                    }
                    else{
                        anStack.push(i)
                    }
                }
                else anStack.push(i)
            }
            return ans
        }
    }
    
    
    
    
    //本题也可以通过动态规划方法
    //状态转换方程
    //qStr(i) == ')' && qStr(i-1) == '(' =》 对称括号
    //dp(i) = dp(i-2) + 2 
    //qStr(i) == ')' && qStr(i-1) == ')' && qStr(i-dp(i-1)-1) == '(' =》右侧括号之前有对称括号
    //dp(i) = dp(i-1) + 2 + dp(i-dp(i-1)-2)
    //当前右括号的dp值为其之前的对称括号范围 + 对称括号范围外的dp值+2
    //其他情况均视为0
    import scala.collection.mutable
    import scala.math
    object Solution {
        def longestValidParentheses(s: String): Int = {
            if(s.length == 0 || s.length == 1) return 0
            var dp = new Array[Int](s.length+1)
            dp(0) = 0
            dp(1) = 0
            val qStr = "*" + s
            println(qStr)
            for(i <- 2 to s.length){
                if(qStr(i) == ')' && qStr(i-1) == '('){
                    dp(i) = dp(i-2) + 2 
                }
                else if (qStr(i) == ')' && qStr(i-1) == ')' && qStr(i-dp(i-1)-1) == '(') dp(i) = dp(i-1) + 2 + dp(i-dp(i-1)-2)
                else dp(i) = 0
                
            }
            println(dp.mkString)
            return dp.max
        }
    }
    
  • 相关阅读:
    redis环境搭建笔记
    mysql主从配置
    虚拟机下的hadoop集群环境搭建。
    maven 集成spring
    maven 集成spring ,mybatis
    andorid一个简单的短信发送程序
    android 一个简单的拨打电话程序
    hibernate 多对多双向关联
    hibernate 多对多注解配置
    hibernat 多对一注解配置
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/12840138.html
Copyright © 2011-2022 走看看