921. Minimum Add to Make Parentheses Valid
Difficulty: Medium
Topics: String, Stack, Greedy
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 <= 1000-
s[i]is either'('or')'.
Solution:
We need to determine how many opening or closing parentheses need to be added to make the input string s valid. A valid string means that every opening parenthesis '(' has a corresponding closing parenthesis ')'.
We can solve this problem using a simple counter approach:
- We use a variable
balanceto keep track of the current balance between opening and closing parentheses. - We use another variable
additionsto count the minimum number of parentheses required.
Approach:
- Loop through each character of the string
s. - If the character is
'(', incrementbalanceby 1. - If the character is
')', decrementbalanceby 1:- If
balancebecomes negative, it means there are more closing parentheses than opening ones. We need to add an opening parenthesis to balance it, so incrementadditionsby 1 and resetbalanceto 0.
- If
- At the end of the loop, if
balanceis greater than 0, it indicates there are unmatched opening parentheses, so addbalancetoadditions.
Let's implement this solution in PHP: 921. Minimum Add to Make Parentheses Valid
<?php
/**
* @param String $s
* @return Integer
*/
function minAddToMakeValid($s) {
...
...
...
/**
* go to ./solution.php
*/
}
// Example usage:
$s1 = "())";
echo minAddToMakeValid($s1); // Output: 1
$s2 = "(((";
echo minAddToMakeValid($s2); // Output: 3
?>
Explanation:
- For the string
s = "())":-
balancebecomes negative when the second')'is encountered, soadditionsis incremented. - At the end,
balanceis 0, andadditionsis 1, so we need 1 addition to make the string valid.
-
- For the string
s = "(((":-
balancebecomes 3 because there are 3 unmatched'('at the end. - The result is
additions + balance, which is0 + 3 = 3.
-
This solution has a time complexity of O(n) where n is the length of the string, and a space complexity of O(1) since we only use a few variables.
Contact Links
If you found this series helpful, please consider giving the repository a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me!
If you want more helpful content like this, feel free to follow me:
Top comments (0)