一起养成写作习惯!这是我参与「掘金日新计划 · 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);
}
}
四、总结
写题解不易,若对你有帮助,点赞评论再走吧。ヽ(✿゚▽゚)ノ,如有不足,请大家斧正。