leetcode-动态规划-32-最长有效括号

题目描述

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()"

输出:2

解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"

输出:4

解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""

输出:0

提示:

0 <= s.length <= 3 * 104

s[i] 为 '(' 或 ')'

思路

这个问题可以通过使用栈(Stack)来解决。栈是一种数据结构,它遵循"后进先出"(Last In First Out,LIFO)的原则,适用于需要保持元素顺序的场景。

解题思路如下:

  1. 我们使用一个栈来存储字符的索引,初始化时将-1(用于表示有效子串的起始位置)推入栈中。

  2. 我们从左到右遍历字符串的每个字符:

    • 如果遇到左括号'(',将其索引推入栈中。
    • 如果遇到右括号')',弹出栈顶元素表示匹配了一个括号,然后计算当前右括号的索引与新栈顶元素之间的距离,即有效子串的长度。这里的距离计算是基于当前右括号与上一个未匹配的左括号之间的距离。
  3. 在遍历过程中,栈中的元素始终表示上一个未匹配的左括号的索引。

  4. 遍历结束后,栈中剩下的元素对应于未匹配的左括号的索引,我们可以利用这些索引来计算可能的最长有效括号子串长度。

这个算法的关键在于使用栈来记录未匹配的左括号的位置,从而能够计算出连续的有效括号子串的长度。算法的时间复杂度是O(n),其中n是字符串的长度。

代码

scala 复制代码
object Solution {
    def longestValidParentheses(s: String): Int = {
        val stack = scala.collection.mutable.Stack[Int]()
        var maxLength = 0
        
        // 初始值用于标记有效子串的起始位置
        stack.push(-1)
        
        for ((char, index) <- s.zipWithIndex) {
            if (char == '(') {
                stack.push(index)
            } else {
                stack.pop()
                if (stack.isEmpty) {
                    stack.push(index)
                } else {
                    maxLength = Math.max(maxLength, index - stack.top)
                }
            }
        }
        
        maxLength
    }

    def main(args: Array[String]): Unit = {
        val s1 = "(()"
        println(longestValidParentheses(s1))  // 输出 2

        val s2 = ")()())"
        println(longestValidParentheses(s2))  // 输出 4

        val s3 = ""
        println(longestValidParentheses(s3))  // 输出 0
    }
}
相关推荐
爱睡懒觉的焦糖玛奇朵5 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具使用说明】
人工智能·python·深度学习·学习·算法·yolo·音视频
Runawayliquor5 小时前
opbase:CANN 所有算子的公共地基
大数据·数据库·人工智能·算法
徐安安ye5 小时前
FlashAttention 为什么对序列长度这么“敏感”?
人工智能·算法
黎阳之光6 小时前
黎阳之光:以视频孪生重构智能监盘,为燃机打造新一代智慧电厂大脑
大数据·人工智能·算法·安全·数字孪生
绝知此事7 小时前
【算法突围 02】树形结构与数据库索引:树形结构与数据库索引:从 BST 到 B+ 树的演化与 MySQL 优化
数据库·mysql·算法·面试·b+树
清木!7 小时前
排序算法比较
数据结构·算法·排序算法
吴可可1238 小时前
用Teigha修改并保存CAD文件
数据库·算法·c#
灰灰勇闯IT9 小时前
ops-reduce:ReduceMax 与 ReduceMean 的并行优化
算法
水木流年追梦9 小时前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
沙威玛_LHE9 小时前
P13376题解
算法