1864. 构成交替字符串需要的最小交换次数Java
文章发布较早,内容可能过时,阅读注意甄别。
# 题目
给你一个二进制字符串 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'
# 思路
统计奇数数位上‘0’的个数
# 解法
class Solution {
public int minSwaps(String s) {
int n = s.length();
int count = 0;
int oneCount = 0;
for(int i = 0; i < n; i++){
if(s.charAt(i) == '0'){
count++;
if(i % 2 == 0){
oneCount++;
}
}
}
if(n % 2 == 0){
if(count != n / 2){
return -1;
}
return Math.min(n / 2 - oneCount, oneCount);
}
if(count < n / 2 || count > n / 2 + 1){
return -1;
}
if(count == n / 2){
return oneCount;
}else{
return n / 2 + 1 - oneCount;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 总结
- 分析出几种情况,然后分别对各个情况实现