921. Minimum Add to Make Parentheses Valid
Description
A parentheses string is valid if and only if:
- It is the empty string,
- It can be written as
AB
(A
concatenated withB
), whereA
andB
are valid strings, or - It can be written as
(A)
, whereA
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: Greedy + Stack
This problem is a classic parenthesis matching problem, which can be solved using "Greedy + Stack".
Iterate through each character $c$ in the string $s$:
- If $c$ is a left parenthesis, directly push $c$ into the stack;
- If $c$ is a right parenthesis, at this point if the stack is not empty, and the top element of the stack is a left parenthesis, then pop the top element of the stack, indicating a successful match; otherwise, push $c$ into the stack.
After the iteration ends, the number of remaining elements in the stack is the number of parentheses that need to be added.
The time complexity is $O(n)$, and the space complexity is $O(n)$, where $n$ is the length of the string $s$.
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
Solution 2: Greedy + Counting
Solution 1 uses a stack to implement parenthesis matching, but we can also directly implement it through counting.
Define a variable cnt
to represent the current number of left parentheses to be matched, and a variable ans
to record the answer. Initially, both variables are set to $0$.
Iterate through each character $c$ in the string $s$:
- If $c$ is a left parenthesis, increase the value of
cnt
by $1$; - If $c$ is a right parenthesis, at this point if $cnt > 0$, it means that there are left parentheses that can be matched, so decrease the value of
cnt
by $1$; otherwise, it means that the current right parenthesis cannot be matched, so increase the value ofans
by $1$.
After the iteration ends, add the value of cnt
to ans
, which is the answer.
The time complexity is $O(n)$, and the space complexity is $O(1)$, where $n$ is the length of the string $s$.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Solution 3: Replace + recursion
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 |
|