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

523 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

一、题目描述

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

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

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

 

示例 1:

输入:s = "111000" 输出:1 解释:交换位置 1 和 4:"111000" -> "101010" ,字符串变为交替字符串。 示例 2:

输入:s = "010" 输出:0 解释:字符串已经是交替字符串了,不需要交换。 示例 3:

输入:s = "1110" 输出:-1  

提示:

1 <= s.length <= 1000 s[i] 的值为 '0' 或 '1'

来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/mi…

二、解题思路

判断一个字符串能不能转换为 01 字符串是容易的,只需要知道 00 和 11 的个数是否相差不超过 11。

注意到 01 字符串的特点:某个位置出现 00 或 11,和它的索引有关:

如果s长度是偶数,统计偶数位的0,返回min(cnt,n/2-cnt),代表需要修复的错位的最小数量 如果s长度是奇数,就不能直接这样做了,因为此时偶数位比奇数位多一个,偶数位只能够填入0和1中数量更多的一方 比如1比0多,那偶数位只能填1,那么统计偶数位上0的数量就是错位的数量

三、AC代码

class Solution {
    public int minSwaps(String s) {
        int cnt0 = 0, cnt1 = 0, n = s.length(); 
        for(char c : s.toCharArray()) 
            if(c - '0' == 1)
                cnt1++;
            else
                cnt0++;
        if(n % 2 == 1) {   
            if(Math.abs(cnt0 - cnt1) != 1)  
                return -1;
        } else if(cnt0 != cnt1) 
            return -1;
        int cnt = 0;    
        char c = cnt0 > cnt1 ? '1' : '0';   
        for(int i = 0; i < n; i += 2)  
            if(s.charAt(i) == c) 
                cnt++;
        return n % 2 == 1 ? cnt : Math.min(cnt, n / 2 - cnt);
    }
}




四、总结

写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。