leet-code/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.java

82 lines
2.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//给你一个二进制字符串 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'
//
// Related Topics 贪心算法
// 👍 8 👎 0
package leetcode.editor.cn;
//1864:构成交替字符串需要的最小交换次数
public class MinimumNumberOfSwapsToMakeTheBinaryStringAlternating{
public static void main(String[] args) {
//测试代码
Solution solution = new MinimumNumberOfSwapsToMakeTheBinaryStringAlternating().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int minSwaps(String s) {
int s0 = s.replace("0", "").length();
int s1 = s.replace("1", "").length();
if (Math.abs(s0 - s1) > 1) {
return -1;
}
int com = 0;
int m0 = 0;
for (int i = 0; i < s.length(); i++) {
if (com != s.charAt(i) - '0') {
m0++;
}
com = 1 - com;
}
m0 = m0 % 2 == 0 ? m0 : Integer.MAX_VALUE;
com = 1;
int m1 = 0;
for (int i = 0; i < s.length(); i++) {
if (com != s.charAt(i) - '0') {
m1++;
}
com = 1 - com;
}
m1 = m1 % 2 == 0 ? m1 : Integer.MAX_VALUE;
return Math.min(m0, m1) / 2;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}