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(Aconcatenated withB), whereAandBare valid strings, or - It can be written as
(A), whereAis 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 <= 1000s[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
cntby \(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
cntby \(1\); otherwise, it means that the current right parenthesis cannot be matched, so increase the value ofansby \(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 | |