1864. 构成交替字符串需要的最小交换次数(思维)

传送门

给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 。

交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 "010" 和 "1010" 属于交替字符串,但 "0100" 不是。

任意两个字符都可以进行交换,不必相邻 。

思路:我们考虑可能的结果只有两种可能,01010...或者10101....,在这两种情况下,我们统计原字符串与其不同的字符数dif,

而每次对换都能纠正两个位置错误的字符,于是dif/2就是可能的解

code:

class Solution {
public:
    int minSwaps(string s) {
    int n=s.size();
    int n1=count(s.begin(),s.end(),'0');
    int n2=count(s.begin(),s.end(),'1');
    int res=INT_MAX;
    //1010...
    if(n2==(n+1)/2){
        int dif=0;
        for(int i=0;i<s.size();i++){
            if(s[i]-'0'==i%2){
             dif++;
            }
        }
        res=min(res,dif/2);
    }
    //01010...
    if(n1==(n+1)/2){
        int dif=0;
        for(int i=0;i<s.size();i++){
            if(s[i]-'0'!=i%2){
                dif++;
            }
        }
        res=min(res,dif/2);
    }
    if(res==INT_MAX){
        return -1;
    }else return res;
    }
};

 

上一篇:[WCF编程]10.操作:回调操作


下一篇:在Outlook客户端使用SSL加密,弹出安全证书警告的解决方法。