力扣周赛第253期(下)

252 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

1963. 使字符串平衡的最小交换次数

截屏2021-08-20 下午8.50.34.png

思路分析

题目精心定义的平衡字符串,其实就是换一种方式定义了,一个左括号对应一个右括号的情况。

本题要求返回将字符串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

截屏2021-08-20 下午9.01.23.png

思路分析

作为一道简单题,相对于反转的实现

while (l < r) {
    char c = cs[l];
    cs[l] = cs[r];
    cs[r] = c;
    l++; r--;
}

唯一一个难点应该就是判断是否是字符串的末尾还是依旧可以截出一个2k长度的字段。

反转规则中标注:

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

其实很恰好的方便了我们仅仅需要翻转k或n-start长度的字符串,而无须第二次额外的判断了。