Skip to content

Commit 64ccfb7

Browse files
P32: accepted (optimal version with editorial)
1 parent d2b5d0f commit 64ccfb7

File tree

19 files changed

+172
-8
lines changed

19 files changed

+172
-8
lines changed

P00032LongestValidParanthesis/index.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,27 @@
11
var longestValidParentheses = function (s) {
2-
if (s.lenth <= 1) return 0;
2+
if (s.length <= 1) return 0;
33

44
const levels = s.split().map(() => 0);
5-
const negs = [-1];
65

7-
levels[0] = s[0] === "(" ? 1 : -1;
6+
let i = 0;
7+
while (s[i] === ")" && i < s.length) {
8+
i++;
9+
}
10+
11+
if (i >= s.length) return 0;
12+
13+
levels[i] = s[i] === "(" ? 1 : -1;
14+
15+
const negs = [];
16+
negs.push(i - 1);
17+
18+
let hasOpen = false;
19+
20+
if (i == 0) i++;
821

9-
for (let i = 1; i < s.length; i++) {
22+
for (; i < s.length; i++) {
23+
// if(s[i] === ")" && !hasOpen) continue;
24+
// hasOpen = true;
1025
levels[i] = levels[i - 1] + (s[i] === "(" ? 1 : -1);
1126
if (levels[i] < 0 && levels[i - 1] >= 0) negs.push(i);
1227
}
@@ -15,23 +30,26 @@ var longestValidParentheses = function (s) {
1530

1631
let result = 0;
1732
for (let i = 1; i < negs.length; i++) {
18-
const l = -levels[negs[i]] + (negs[i] - negs[i - 1] - 1);
19-
if (l < result) result = l;
33+
// console.log(negs[i], negs[i - 1], levels[negs[i] - 1]);
34+
const l = negs[i] - negs[i - 1] - 1 - levels[negs[i] - 1];
35+
if (l > result && Math.abs(negs[i] - negs[i - 1] - 1) > 1) result = l;
2036
}
2137

22-
console.log(negs);
23-
console.log(levels);
38+
console.log("negs:", negs);
39+
console.log("levels:", levels);
2440
return result;
2541
};
2642

2743
const tests = [
2844
{ i: "()", o: 2 },
2945
{ i: ")(", o: 0 },
46+
{ i: "())(", o: 2 },
3047
{ i: ")()", o: 2 },
3148
{ i: ")())", o: 2 },
3249
{ i: ")()())", o: 4 },
3350
{ i: ")()((((((((((())))))))))))", o: 24 },
3451
{ i: "(()", o: 2 },
52+
{ i: "()(()", o: 2 },
3553
];
3654

3755
for (let { i, o } of tests) {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
class Solution {
6+
public:
7+
int longestValidParentheses(string s) {
8+
stack<int> stack;
9+
stack.push(-1);
10+
int maxLen = 0;
11+
12+
for (int i = 0; i < s.size(); i++) {
13+
auto last = stack.top();
14+
if (last != -1 && s[i] == ')' && s[last] == '(') {
15+
stack.pop();
16+
maxLen = max(maxLen, i - stack.top());
17+
} else {
18+
stack.push(i);
19+
}
20+
}
21+
22+
return maxLen;
23+
}
24+
};
25+
26+
int main() {
27+
Solution sol;
28+
string s;
29+
30+
cin >> s;
31+
32+
if (s.size() == 0) {
33+
cout << 0 << endl;
34+
return 0;
35+
}
36+
37+
cout << sol.longestValidParentheses(s) << endl;
38+
39+
return 0;
40+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
class Solution {
6+
public:
7+
int find(string &s, int start, vector<int> &memo) {
8+
if (start >= s.size() - 1)
9+
return 0;
10+
11+
if (memo[start] != -1) {
12+
return memo[start];
13+
}
14+
15+
if (s[start] != '(') {
16+
memo[start] = 0;
17+
return 0;
18+
}
19+
20+
if (s[start + 1] == ')') {
21+
memo[start] = 2;
22+
return 2;
23+
}
24+
25+
auto nextChar = start + 1;
26+
auto totalInner = 0;
27+
28+
while (true) {
29+
auto inner = find(s, nextChar, memo);
30+
31+
if (inner == 0) {
32+
break;
33+
}
34+
totalInner += inner;
35+
nextChar += inner;
36+
}
37+
38+
if (start + totalInner + 1 >= s.size()) {
39+
memo[start] = 0;
40+
return 0;
41+
}
42+
43+
if (s[start + totalInner + 1] == ')') {
44+
memo[start] = totalInner + 2;
45+
return totalInner + 2;
46+
}
47+
48+
return 0;
49+
}
50+
51+
int longestValidParentheses(string s) {
52+
int currentIndex = 0;
53+
int max = 0;
54+
int currentGroup = 0;
55+
vector<int> memo(s.size(), -1);
56+
57+
while (currentIndex < s.size()) {
58+
auto result = find(s, currentIndex, memo);
59+
if (result == 0) {
60+
currentGroup = 0;
61+
currentIndex++;
62+
} else {
63+
currentGroup += result;
64+
currentIndex += result;
65+
if (currentGroup > max) {
66+
max = currentGroup;
67+
}
68+
}
69+
}
70+
71+
return max;
72+
}
73+
};
74+
75+
int main() {
76+
Solution sol;
77+
string s;
78+
79+
cin >> s;
80+
81+
if (s.size() == 0) {
82+
cout << 0 << endl;
83+
return 0;
84+
}
85+
86+
cout << sol.longestValidParentheses(s) << endl;
87+
88+
return 0;
89+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
))))()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
)()())
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
((()))

0 commit comments

Comments
 (0)