(LeetCode每日一题) 1963. 使字符串平衡的最小交换次数(贪心、双指针)

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

在这里插入图片描述
在这里插入图片描述

方法一:对于符合要求的字符串,需要任何[0,i]部分,“[”都不比“]”少。[ 视为+1,] 视为-1,那么任何前缀和sum都不能出现sum<0。
当sum<0,说明当前的 ] 需要用 [ 来置换,这里用到贪心,用最右边的 [ 来替换。也就是希望这个当前 ] 带来的-1影响能最晚发生。

C++版本:

class Solution {
public:
    int minSwaps(string s) {
        int ans=0;
        int sum=0;
        int j=s.size()-1;
        for(auto c:s){
            if(c=='['){
                sum++;
            }else{
                if(sum>0){
                    sum--;
                }else{
                    while(s[j]!='['){
                        j--;
                    }
                    s[j]=']';
                    sum++;
                    ans++;
                }
            }
        }
        return ans;
    }
};

JAVA版本:

class Solution {
    public int minSwaps(String s) {
        int ans=0;
        int sum=0;
        char[] c=s.toCharArray();
        int j=c.length-1;
        for(char x:c){
            if(x=='['){
                sum++;
            }else{
                if(sum>0){
                    sum--;
                }else{
                    while(c[j]!='['){
                        j--;
                    }
                    sum++;
                    ans++;
                }
            }
        }
        return ans;
    }
}

方法二:其实置换后,会发现,被置换的位置右边都是 ] ,根本不会有sum<0的情况。因此到这被置换的位置时,肯定sum>0,直接可以提前结束了,所以没必要去修改被置换的位置为 ] 。直接sum++,c++即可。
C++版本:

class Solution {
public:
    int minSwaps(string s) {
        int ans=0;
        int sum=0;
        for(auto c:s){
            if(c=='['){
                sum++;
            }else{
                if(sum>0){
                    sum--;
                }else{
                    sum++;
                    ans++;
                }
            }
        }
        return ans;
    }
};

JAVA版本:

class Solution {
    public int minSwaps(String s) {
        int ans=0;
        int sum=0;
        char[] c=s.toCharArray();
        for(char x:c){
            if(x=='['){
                sum++;
            }else{
                if(sum>0){
                    sum--;
                }else{
                    sum++;
                    ans++;
                }
            }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值