Description
You are given a 0-indexed string s of even length n. The string consists of exactly n / 2 opening brackets ‘[’ and n / 2 closing brackets ‘]’.
A string is called balanced if and only if:
It is the empty string, or
It can be written as AB, where both A and B are balanced strings, or
It can be written as [C], where C is a balanced string.
You may swap the brackets at any two indices any number of times.
Return the minimum number of swaps to make s balanced.
Example 1:
Input: s = "][]["
Output: 1
Explanation: You can make the string balanced by swapping index 0 with index 3.
The resulting string is "[[]]".
Example 2:
Input: s = "]]][[["
Output: 2
Explanation: You can do the following to make the string balanced:
- Swap index 0 with index 4. s = "[]][][".
- Swap index 1 with index 5. s = "[[][]]".
The resulting string is "[[][]]".
Example 3:
Input: s = "[]"
Output: 0
Explanation: The string is already balanced.
Constraints:
n == s.length
2 <= n <= 10^6
n is even.
s[i] is either '[' or ']'.
The number of opening brackets '[' equals n / 2, and the number of closing brackets ']' equals n / 2.
Solution
Solved after hints…
Intuitive
When there’s an imbalanced ]
, use the rightest [
to swap.
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
1
)
o(1)
o(1)
Greedy
Keep track of the maximum imbalance, to solve this imbalance, we need to do (im+1)//2
swaps.
Time complexity:
o
(
n
)
o(n)
o(n)
Space complexity:
o
(
1
)
o(1)
o(1)
Code
Intuitive
class Solution:
def minSwaps(self, s: str) -> int:
open_to_swap = len(s) - 1
while open_to_swap >= 0 and s[open_to_swap] == ']':
open_to_swap -= 1
cnter = 0
res = 0
i = 0
while i < open_to_swap:
if s[i] == '[':
cnter += 1
else:
cnter -= 1
if cnter < 0:
res += 1
open_to_swap -= 1
while open_to_swap >= i and s[open_to_swap] == ']':
open_to_swap -= 1
cnter += 2
i += 1
return res
Greedy
class Solution:
def minSwaps(self, s: str) -> int:
cnter = 0
max_imbalance = 0
for each_c in s:
if each_c == ']':
cnter -= 1
else:
cnter += 1
max_imbalance = min(max_imbalance, cnter)
return (-max_imbalance + 1) // 2