32. Longest Valid Parentheses
2016-09-02 21:18
253 查看
解题思路:
基本的想法就是用栈来实现。从字符串的第一个位置开始读起,遇到左括号的话就入栈,遇到右括号的话就将栈顶元素弹出,并且判断当前序列的最长长度。
栈里保存的是左括号的位置。
具体遇到右括号时,有如下几种情况需要考虑:
当前栈内无元素,则用start变量记录当前右括号的位置,表明下次比较从该右括号下一个位置开始判断;
当前栈内有元素,则将栈顶元素弹出。如果弹出后的栈为空,则表明当前括号匹配,这时计算出当前的最长序列长度,即当前位置的值减去start的值即是;
当前栈内又元素且弹出后的栈内仍然有元素,则最长序列长度为当前元素位置减去栈顶元素的位置。
本算法仅需要扫描一遍字符串,所以时间复杂度为O(n);
#include<iostream> #include<stack> #include<string> using namespace std; class Solution { public: int longestValidParentheses(string s) { if(s.size()==0) return 0; int i; int start=0,len=0; stack<int>a; for(i=0;i<s.length();i++) { if(s[i]=='(')//等于左括号就把它的下标入堆 a.push(i); else//等于右括号 { if(a.empty())//如果栈里为空没有匹配的,直接移到下一个下标i+1 start=i+1; else { a.pop();//如果有匹配的先弹出栈顶元素 if(a.empty()) len=len>(i-start+1)?len:i-start+1;//如果弹出后的栈为空,则表明当前括号匹配,这时计算出当前的最长序列长度,即当前位置的值减去start的值加1即是; else len=len>(i-a.top())?len:i-a.top();//如果弹出后的栈内仍然有元素,则最长序列长度为当前元素位置减去栈顶元素的位置 } } } return len; } }; int main() { string s; cin>>s; int result; Solution solve; result=solve.longestValidParentheses(s); cout<<result<<endl; return 0; }
相关文章推荐
- 32. Longest Valid Parentheses
- 32. Longest Valid Parentheses
- 32 Longest Valid Parentheses
- 32. Longest Valid Parentheses
- LeetCode (32) Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses (栈,括号匹配)
- LeetCode | 32. Longest Valid Parentheses——最长有效括号匹配长度
- 32. Longest Valid Parentheses *HARD*
- LeetCode - 32 -Longest Valid Parentheses.md
- leetcode 32. Longest Valid Parentheses——(use stack)
- leetcode 32. Longest Valid Parentheses
- 32. Longest Valid Parentheses
- 32. Longest Valid Parentheses
- 32. Longest Valid Parentheses
- 32. Longest Valid Parentheses
- LeetCode (32): Longest Valid Parentheses
- leetcode 32:Longest Valid Parentheses
- 32. Longest Valid Parentheses
- 32. Longest Valid Parentheses leetcode python new season 2016
- 32. Longest Valid Parentheses