Minimum Number of Swaps to Make the String Balanced
LeetCode 2095 | Difficulty: Mediumβ
MediumProblem 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 bothAandBare balanced strings, or -
It can be written as
[C], whereCis 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 -
nis even. -
s[i]is either'['or']'. -
The number of opening brackets
'['equalsn / 2, and the number of closing brackets']'equalsn / 2.
Topics: Two Pointers, String, Stack, Greedy
Approachβ
Stackβ
Use a stack (LIFO) to track elements that need future processing. Process elements when a "trigger" condition is met (e.g., finding a smaller/larger element). Monotonic stack maintains elements in sorted order for next greater/smaller element problems.
Matching brackets, next greater element, evaluating expressions, backtracking history.
Greedyβ
At each step, make the locally optimal choice. The challenge is proving the greedy choice leads to a global optimum. Look for: can I sort by some criterion? Does choosing the best option now ever hurt future choices?
Interval scheduling, activity selection, minimum coins (certain denominations), Huffman coding.
Solutionsβ
Solution 1: C# (Best: 116 ms)β
| Metric | Value |
|---|---|
| Runtime | 116 ms |
| Memory | 68.4 MB |
| Date | 2022-01-21 |
public class Solution {
public int MinSwaps(string s) {
int size = 0;
for(int i=0;i<s.Length;i++)
{
if(s[i] == '[')
{
size++;
}
else
{
if(size>0) size--;
}
}
return (size+1)/2;
}
}
Complexity Analysisβ
| Approach | Time | Space |
|---|---|---|
| Two Pointers | ||
| Stack |
Interview Tipsβ
- Discuss the brute force approach first, then optimize. Explain your thought process.
- Think about what triggers a pop: is it finding a match, or finding a smaller/larger element?
- LeetCode provides 3 hint(s) for this problem β try solving without them first.
π‘ Hints
Hint 1: Iterate over the string and keep track of the number of opening and closing brackets on each step.
Hint 2: If the number of closing brackets is ever larger, you need to make a swap.
Hint 3: Swap it with the opening bracket closest to the end of s.