LeetCode系列之【32. 最长有效括号】C++ 每天一道leetcode!

目录(快速导航)

题目描述

视频讲解 https://www.bilibili.com/video/av66667898/

思路

代码


题目描述:

题目链接:https://leetcode-cn.com/problems/longest-valid-parentheses/

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

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

视频讲解

https://www.bilibili.com/video/av66667898/


思路:

看到括号匹配,第一个想到的应该就是栈。

因为这道题需要统计最长有效括号子串的长度,所以拿下标来做最好。也就是在栈里存储下标。

因为,只有两种字符,分两种情况:

  1. 遇到‘(’,直接把对应的下标push到栈中;因为‘(’是不能匹配弹出字符的,括号只有右括号才能标识一个完整的括号喔!
  2. 遇到‘)’:
  • 弹出栈顶的下标
  • 检测栈是否为空,如果为空,将当前‘)’的下标push进入栈中,然后continue;
  • 栈不为空,用当前‘)’的下标减去栈顶的下标,得到目前子串的长度count,与当前最大长度max_count比较,并存储大的数值在max_count中。

注意:

  1. 初始化栈时,添加栈底元素-1;
  2. 遇到‘)’的时候,不论什么情况,首先需要pop栈顶元素。如果此时栈中没有元素,才记录自己的下标到栈底,这样时刻保持了最多最多只有only1个‘)’在栈中(当然存储的是它的下标)。

代码:

class Solution {
public:
    int longestValidParentheses(string s) {
        int max_count = 0, count =0;
        stack brackets;
        // 初始化栈 -1
        brackets.push(-1);
        for (int i = 0;i < s.size();i++) {
            // 如果字符为‘(’ 那么就把下标放进栈中
            if (s[i] == '(') {
                brackets.push(i);
            }
            // 字符为‘)’
            else {
                // 不论怎样 先pop
                brackets.pop();
                // 如果栈空了 记录当前字符的下标到栈底
                if (brackets.empty()) {
                    brackets.push(i);
                }
                // 计算子串的长度
                count = i-brackets.top();
                max_count = max_count > count ? max_count : count;
            }
        }
        return max_count;
    }
};

一起加油!!刷题!!

你可能感兴趣的:(leetcode)