Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
For "(()"
, the longest valid parentheses substring is "()"
, which has length = 2.
Another example is ")()())"
, where the longest valid parentheses substring is "()()"
, which has length = 4.
题意:给定一个包含括号 '(',')'的字符串,返回最长匹配的括号数目
思路1:栈
用一个变量_max表示当前最长匹配的括号数
不存右括号,只存左括号的index。扫描一遍字符串,
如果当前的字符是'(',则压栈
如果当前的字符是')',则
1.若栈空,则当前的')'没有一个'('与它匹配,它可以作用它左右两个匹配的括号串的分割点,用一个变量 last 记录下它的坐标。
last的初始值是-1,当遇到新的分割点时,我们更新 last,并可以得到两个 last之间的匹配括号的长度
2.若栈非空,则当前的')'与栈顶的'('匹配
将栈顶元素出栈
如果此时栈为空,则找到了一组匹配括号串,更新 _max = max(_max, last - i)
如果此时栈不空,则栈顶的'('还没找到它的')',因为栈顶元素有可能找不到它的')',因此,此时要更新 _max = max(_max, i - stack.top())
复杂度:时间O(n),空间O(n)
int longestValidParentheses(string s){ int _max = 0, last = -1; stack<int> left; for(int i = 0; i < s.size(); ++i){ if(s[i] == '(') left.push(i); else{ if(left.empty()) last = i; else{ left.pop(); if(left.empty()){ _max = max(_max, i - last); }else{ _max = max(_max, i - left.top()); } } } } return _max; }