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之路