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

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode5760. 构成交替字符串需要的最小交换次数相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/minimum-number-of-swaps-to-make-the-binary-string-alternating/

解题思路

我们可以发现

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

代码

class Solution {
    public int minSwaps(String s) {
        int cnt0 = 0, cnt1 = 0, n = s.length(); //cnt0记录s中0的个数,cnt1记录1的个数
        for(char c : s.toCharArray())   //计数
            if(c - '0' == 1)
                cnt1++;
            else
                cnt0++;
        if(n % 2 == 1) {    //如果s的长度为奇数
            if(Math.abs(cnt0 - cnt1) != 1)  //如果1和0的个数相差不等于1,就代表不可能组成交替字符串,直接返回-1
                return -1;
        } else if(cnt0 != cnt1) //如果s的长度是偶数,并且1和0的个数不相同,直接返回-1
            return -1;
        int cnt = 0;    //记录偶数位c的个数
        char c = cnt0 > cnt1 ? '1' : '0';   //如果0的个数大于1的个数,记录偶数位1的个数,反之记录0的个数
        for(int i = 0; i < n; i += 2)   //记录偶数位c的个数
            if(s.charAt(i) == c) 
                cnt++;
        return n % 2 == 1 ? cnt : Math.min(cnt, n / 2 - cnt);   //如果s为奇数,则直接返回cnt;如果位奇数,返回需要修复的错位的最小数量
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

以上是关于Leetcode5760. 构成交替字符串需要的最小交换次数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1129颜色交替的最短路径广度优先HERODING的LeetCode之路

b_lc_构成交替字符串需要的最小交换次数(思维+分类讨论两种方案)

LeetCode 1768. 交替合并字符串

leetcode-1195-交替打印字符串

LeetCode(多线程)- 1195. 交替打印字符串

LeetCode Go 并发题详解:交替打印字符串