LeetCode 32. 最长有效括号(Longest Valid Parentheses)

题目描述

 

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

示例 1:

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

示例 2:

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

 

解题思路

 

设置一个栈保存字符串当前位置之前的所有'('的索引,并维护当前有效括号的前一个索引以及最长有效括号长度。每当遇到一个'('就将其索引入栈,遇到')'则分为两种情况:

  • 若此时栈为空,说明此位置一定不在有效括号内,更新当前有效括号的前一个索引;
  • 若栈不为空,则弹出栈顶索引,此时此位置一定在当前有效括号内。若出栈后栈变为空,则有效括号长度可从最初位置算起;若不为空,则有效括号长度需从当前栈顶索引之后算起

 

代码

 

 1 class Solution {
 2 public:
 3     int longestValidParentheses(string s) {
 4         stack<int> st;
 5         int maxLen = 0, left = -1;
 6         for(int i = 0; i < s.length(); i++){
 7             if(s[i] == '(') st.push(i);
 8             else{
 9                 if(st.size()){
10                     st.pop();
11                     if(st.empty()) maxLen = max(maxLen, i - left);
12                     else maxLen = max(maxLen, i - st.top());
13                 }
14                 else left = i;
15             }
16         }
17         return maxLen;
18     }
19 };

 

posted @ 2018-09-29 15:27  FlyingWarrior  阅读(528)  评论(0编辑  收藏  举报