这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
1963. 使字符串平衡的最小交换次数
思路分析
题目精心定义的平衡字符串,其实就是换一种方式定义了,一个左括号对应一个右括号的情况。
本题要求返回将字符串s变成平衡字符串所需要的最小交换次数。我们假设不匹配一个左括号对应一个右括号的情况一定要x个,那么这个交换次数最大为x,最小为x/2(因为交换一次左右括号,可能会同时将两对不匹配的括号变得匹配)。考虑到奇偶的影响,可以理解为x/2向上取整。
我们也可以通过将tmp--变为tmp++的形式,实现【因为交换一次左右括号,可能会同时将两对不匹配的括号变得匹配】的情况。
int minSwaps(string s) {
int tmp = 0;
int ret = 0;
for(int i = 0; i < s.size(); i++){
if (s[i] == '['){
tmp++;
}else {
if (tmp == 0){
tmp++;
ret++;
}else{
tmp--;
}
}
}
return ret;
}
每日一题 541. 反转字符串 II
思路分析
作为一道简单题,相对于反转的实现
while (l < r) {
char c = cs[l];
cs[l] = cs[r];
cs[r] = c;
l++; r--;
}
唯一一个难点应该就是判断是否是字符串的末尾还是依旧可以截出一个2k长度的字段。
反转规则中标注:
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
其实很恰好的方便了我们仅仅需要翻转k或n-start长度的字符串,而无须第二次额外的判断了。