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

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

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

方法一:对于符合要求的字符串,需要任何[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;
    }
}

你可能感兴趣的:(java版刷题,LeetCode,leetcode,算法,职场和发展,java,c++)