问题背景
给你一个字符串 s s s,下标从 0 0 0 开始 ,且长度为偶数 n n n。字符串 恰好 由 n / 2 n / 2 n/2 个开括号 '[' 和 n / 2 n / 2 n/2 个闭括号 ']' 组成。
只有能满足下述所有条件的字符串才能称为 平衡字符串 :
- 字符串是一个空字符串,或者
- 字符串可以记作 A B AB AB,其中 A A A 和 B B B 都是 平衡字符串 ,或者
- 字符串可以写成 [ C ] [C] [C],其中 C C C 是一个 平衡字符串 。
你可以交换 任意 两个下标所对应的括号 任意 次数。
返回使 s s s 变成 平衡字符串 所需要的 最小 交换次数。
数据约束
- n = s . l e n g t h n = s.length n=s.length
- 2 ≤ n ≤ 1 0 6 2 \le n \le 10 ^ 6 2≤n≤106
- n n n 为偶数。
- s [ i ] s[i] s[i] 为'[' 或 ']'
- 开括号 '[' 的数目为 n / 2 n / 2 n/2,闭括号 ']' 的数目也是 n / 2 n / 2 n/2。
解题过程
分析清楚过程之后代码就很好写,可以通过积分制来判断字符串的平衡情况,遇到左括号就增加,遇到右括号就减少。
遍历的过程中不必真的进行交换,题目保证了字符串一定能转化成平衡的情形,那总积分就不可能为负。
不交换会导致平衡时为零的分数额外进行了一倍的增加,修正一下就可以得到最终的结果。
具体实现
java
class Solution {
public int minSwaps(String s) {
int res = 0;
for (char c : s.toCharArray()) {
if (c == '[' || res == 0) {
res++;
} else {
res--;
}
}
return res >>> 1;
}
}