-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathLongest Valid Parentheses.cpp
79 lines (61 loc) · 1.37 KB
/
Longest Valid Parentheses.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include <stack>
using namespace std;
class Solution1 {
public:
int longestValidParentheses(string s) {
int max_len = 0;
int temp_len;
if(s.size()==0) return max_len;
stack<int> Stack;
for(int i=0;i<s.size();i++){
if(s[i]=='(')
Stack.push(-1);
else{
if(!Stack.empty())
reduce(Stack, max_len);
}
}
update(max_len, Stack);
return max_len;
}
void reduce_int(stack<int>& s, int value){
if(!s.empty() && s.top()>0)
s.top() += value;
else
s.push(value);
}
void reduce(stack<int>& s, int& max_len){
if (s.top() > 0 && s.size()>=2) {
int temp = s.top();
s.pop();s.pop();
reduce_int(s, temp+2);
}
else if(s.top() < 0){
s.pop();
reduce_int(s, 2);
}
else{
update(max_len,s);
}
}
void update(int& max_len, stack<int>& s){
int curr = 0;
while(!s.empty()){
if(s.top()>0){
curr += s.top();
max_len = max(max_len, curr);
}
else{
curr = 0;
}
s.pop();
}
}
};
/*
int main(){
Solution s;
string ss =")()())()()(";
cout << s.longestValidParentheses(ss);
}*/