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
}
}