[LeetCode] 32. Longest Valid Parentheses(最长合法括号对)
- Difficulty: Hard
- Related Topics: String, Dynamic Programming
- Link: https://leetcode.com/problems/longest-valid-parentheses/
Description
Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.
给定一只包含 '(' 和 ')' 的字符串,返回其最长合法括号对的长度。
Examples
Example 1
Input: s = "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()".
Example 2
Input: s = ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()".
Example 3
Input: s = ""
Output: 0
Constraints
- s <= s.length <= 3e4
- s[i]is- '('or- ')'.
Solution
首先,利用栈把匹配的括号找出来,具体规则如下:
- 
遇到左括号:将其下标入栈; 
- 
遇到右括号:如果栈顶下标对应的是左括号,则弹出栈顶元素,否则将其下标入栈。 
这样做完,栈内剩下的是没有匹配的括号的下标,两个下标间构成的子串为合法括号对,比较这些括号队的长度即可(如果栈是空的,说明整个字符串都符合要求)。代码如下:
import kotlin.math.max
class Solution {
    fun longestValidParentheses(s: String): Int {
        val stack = ArrayDeque<Int>()
        for (i in s.indices) {
            if (s[i] == '(') {
                stack.push(i)
            } else {
                if (stack.isNotEmpty() && s[stack.peek()] == '(') {
                    stack.pop()
                } else {
                    stack.push(i)
                }
            }
        }
        if (stack.isEmpty()) {
            return s.length
        }
        var result = 0
        var end = s.length
        var begin = 0
        while (stack.isNotEmpty()) {
            begin = stack.pop()
            result = max(result, end - begin - 1)
            end = begin
        }
        return result
    }
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号