力扣 题目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 }
View Code

 

posted @ 2022-04-22 12:35  无聊的阿库娅  阅读(17)  评论(0编辑  收藏  举报