No.32 Longest Valid Parentheses
题目给出(和)组成的字符串,给出合法的最长的长度(即不违反()配对规则)。
这道题的解法为,从头到尾滤一遍,用栈的方式,先把配对情况整体给一遍,因为用栈的方式,一定会让配对的括号被标记出来,配对为1,不配对为0,最后找最长的连续1的个数。比如)()())标记出来是011110,那么连续的1为4个,最长的合法序列长度为4。
((()))这种配对情况就是111111,最后返回6。
栈中存储的是左括号的index,遇到右括号就弹栈,把弹出的左括号位置的标记和该右括号的标记都改为1。
class Solution { public: int longestValidParentheses(string s) { bool *flag=new bool[s.size()]; memset(flag,false,s.size()); stack<int> st; for(int i=0;i<s.size();i++){ if(s[i]=='('){ st.push(i); } else{ if(!st.empty()){ flag[i]=true; flag[st.top()]=true; st.pop(); } } } int max_num=0; int cur_num=0; for(int i=0;i<s.size();i++){ if(flag[i]==1){ cur_num++; } else{ if(cur_num>max_num) max_num=cur_num; cur_num=0; } } if(cur_num>max_num) max_num=cur_num; return max_num; } };