Leetcode_32_Longest Valid Parentheses
阿新 • • 發佈:2018-12-22
思路一:
1.和判斷括號是否匹配相似,先遍歷一回字串,能匹配的先彈棧,不能匹配的先將下標壓棧。
此時,需要注意一個特殊情況:當字串為空時,可直接返回0.
2.再遍歷一回棧,根據留在棧中的下標判斷每一串匹配好的括號的長度,選擇最長的一個即可。
在此過程中,需要注意以下幾個特殊情況:
(1)棧為空:說明整個串均為有效的括號
(2)棧底元素不為1:說明在串的開頭存在有效括號,不要漏了
(3)棧頂元素不為n-1(n為串的長度):說明在串的結尾處存在有效括號,不要漏了
class Solution { public: int longestValidParentheses(string s) { vector<int> parentheses_stack; int ans=0,i,n=s.size(); if(n==0 || n==1) return 0; for(i=0;i<n;i++) { if(s[i]=='(') parentheses_stack.push_back(i); else { if(parentheses_stack.empty()) parentheses_stack.push_back(i); else if(s[*(parentheses_stack.end()-1)]=='(') parentheses_stack.pop_back(); else parentheses_stack.push_back(i); } } n=parentheses_stack.size(); if(n==0) return s.size(); if(parentheses_stack[0]!=0) ans=parentheses_stack[0]; for(i=0;i<n-1;i++) if(ans<(parentheses_stack[i+1]-parentheses_stack[i]-1)) ans=parentheses_stack[i+1]-parentheses_stack[i]-1; if(ans<s.size()-parentheses_stack[n-1]-1) ans=s.size()-parentheses_stack[n-1]-1; return ans; } };
二、做法同上類似,但不需要遍歷兩遍,實現起來更簡潔
class Solution { public: int longestValidParentheses(string s) { int ans=0,lastError=-1; vector<int> stack; for(int i=0;i<s.size();i++) { if(s[i]=='(') stack.push_back(i); else { if(stack.size()>0) { stack.pop_back(); int len; if(stack.size()==0) len=i-lastError; else len=i-stack.back(); if(len>ans) ans=len; } else lastError=i; } } return ans; } };