力扣 题目32-- 最长有效括号
题目
题解
在第20题 力扣 题目20-- 有效的括号 我采用了栈的方法匹配
那么这题应该可以利用栈去匹配 但是这题并不是问的一共匹配了多少 而是连续最长匹配了多少
我们想一下 通过栈可以找到所有匹配的括号 那么剩下的不就是没有匹配的吗?
以()(()为例
先vector<int> vec(s.size(),1); 那么此时vec里面是{1,1,1,1,1}
让匹配到的括号位置为0 匹配了之后 {0,0,1,0,0}
那么此时我们以1分割开来 然后数0 0数量最多的那个就是答案
代码
1 #include<iostream> 2 #include<stack> 3 #include<string> 4 #include<vector> 5 using namespace std; 6 7 class Solution { 8 public: 9 int longestValidParentheses(string s) { 10 int num = 0; 11 stack<int> leftstk; 12 vector<int> vec(s.size(),1); 13 int jilu = 0; 14 int max = 0; 15 //匹配 16 for (int i = 0; i < s.size(); i++) { 17 //40是左括号 左括号的位置放进栈 18 if (s[i] ==40) { 19 leftstk.push(i); 20 } 21 else { 22 //如果为空 就是单右括号不匹配不用改变 23 if (leftstk.empty()) { 24 continue; 25 } 26 else { 27 //匹配成功 将匹配成功的两个括号位置的vector位置改变为0 28 vec[i] = 0; 29 vec[leftstk.top()] = 0; 30 //出栈 匹配下一个 31 leftstk.pop(); 32 } 33 } 34 } 35 //遍历vec 找到0最多的情况 36 for (int i = 0; i < vec.size(); i++) { 37 if (vec[i] == 0) { 38 jilu = jilu + 1; 39 } 40 else 41 { 42 jilu = 0; 43 } 44 if (max < jilu) { 45 max = jilu; 46 } 47 } 48 return max; 49 } 50 }; 51 52 int main() { 53 Solution sol; 54 string s = ")(()(()(((())(((((()()))((((()()(()()())())())()))()()()())(())()()(((()))))()((()))(((())()((()()())((())))(())))())((()())()()((()((())))))((()(((((()((()))(()()(())))((()))()))())"; 55 int num=sol.longestValidParentheses(s); 56 cout << num << endl; 57 }