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 ')'.
Solution
Use a counter to keep track of the number of parentheses. When it’s (
, add 1
to counter, when it’s )
, subtract 1
to counter. When counter is negative, add the absolute value to final result, and change the counter to be 0
.
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
1
)
o(1)
o(1)
Code
class Solution:
def minAddToMakeValid(self, s: str) -> int:
res = 0
cnter = 0
for each_c in s:
if each_c == '(':
cnter += 1
else:
cnter -= 1
if cnter < 0:
res -= cnter
cnter = 0
return res + cnter