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
    }
}
posted @ 2020-05-07 00:29  ganshuoos  阅读(122)  评论(0编辑  收藏  举报