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 |
|