Description#
A parentheses string is valid if and only if:
- It is the empty string,
- It can be written as
AB
(A
concatenated with B
), where A
and B
are valid strings, or - It can be written as
(A)
, where A
is a valid string.
You are given a parentheses string s
. In one move, you can insert a parenthesis at any position of the string.
- For example, if
s = "()))"
, you can insert an opening parenthesis to be "(()))"
or a closing parenthesis to be "())))"
.
Return the minimum number of moves required to make s
valid.
Example 1:
Input: s = "())"
Output: 1
Example 2:
Input: s = "((("
Output: 3
Constraints:
1 <= s.length <= 1000
s[i]
is either '('
or ')'
.
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
| class Solution:
def minAddToMakeValid(self, s: str) -> int:
stk = []
for c in s:
if c == ')' and stk and stk[-1] == '(':
stk.pop()
else:
stk.append(c)
return len(stk)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Solution {
public int minAddToMakeValid(String s) {
Deque<Character> stk = new ArrayDeque<>();
for (char c : s.toCharArray()) {
if (c == ')' && !stk.isEmpty() && stk.peek() == '(') {
stk.pop();
} else {
stk.push(c);
}
}
return stk.size();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Solution {
public:
int minAddToMakeValid(string s) {
string stk;
for (char c : s) {
if (c == ')' && stk.size() && stk.back() == '(')
stk.pop_back();
else
stk.push_back(c);
}
return stk.size();
}
};
|
1
2
3
4
5
6
7
8
9
10
11
| func minAddToMakeValid(s string) int {
stk := []rune{}
for _, c := range s {
if c == ')' && len(stk) > 0 && stk[len(stk)-1] == '(' {
stk = stk[:len(stk)-1]
} else {
stk = append(stk, c)
}
}
return len(stk)
}
|
Solution 2#
1
2
3
4
5
6
7
8
9
10
11
12
| class Solution:
def minAddToMakeValid(self, s: str) -> int:
ans = cnt = 0
for c in s:
if c == '(':
cnt += 1
elif cnt:
cnt -= 1
else:
ans += 1
ans += cnt
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Solution {
public int minAddToMakeValid(String s) {
int ans = 0, cnt = 0;
for (char c : s.toCharArray()) {
if (c == '(') {
++cnt;
} else if (cnt > 0) {
--cnt;
} else {
++ans;
}
}
ans += cnt;
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class Solution {
public:
int minAddToMakeValid(string s) {
int ans = 0, cnt = 0;
for (char c : s) {
if (c == '(')
++cnt;
else if (cnt)
--cnt;
else
++ans;
}
ans += cnt;
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| func minAddToMakeValid(s string) int {
ans, cnt := 0, 0
for _, c := range s {
if c == '(' {
cnt++
} else if cnt > 0 {
cnt--
} else {
ans++
}
}
ans += cnt
return ans
}
|