From 73d80b1da770456644921ed07cc9edd605fbd584 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Mon, 7 Jun 2021 13:09:24 +0800 Subject: [PATCH] =?UTF-8?q?1864:=E6=9E=84=E6=88=90=E4=BA=A4=E6=9B=BF?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=9C=80=E8=A6=81=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E4=BA=A4=E6=8D=A2=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...SwapsToMakeTheBinaryStringAlternating.java | 82 +++++++++++++++++++ ...OfSwapsToMakeTheBinaryStringAlternating.md | 40 +++++++++ 2 files changed, 122 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.java create mode 100644 src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.md diff --git a/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.java b/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.java new file mode 100644 index 0000000..d405b30 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.java @@ -0,0 +1,82 @@ +//给你一个二进制字符串 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) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.md b/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.md new file mode 100644 index 0000000..dc2061b --- /dev/null +++ b/src/main/java/leetcode/editor/cn/MinimumNumberOfSwapsToMakeTheBinaryStringAlternating.md @@ -0,0 +1,40 @@ +

给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1

+ +

交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 "010""1010" 属于交替字符串,但 "0100" 不是。

+ +

任意两个字符都可以进行交换,不必相邻

+ +

 

+ +

示例 1:

+ +
+输入:s = "111000"
+输出:1
+解释:交换位置 1 和 4:"111000" -> "101010" ,字符串变为交替字符串。
+
+ +

示例 2:

+ +
+输入:s = "010"
+输出:0
+解释:字符串已经是交替字符串了,不需要交换。
+
+ +

示例 3:

+ +
+输入:s = "1110"
+输出:-1
+
+ +

 

+ +

提示:

+ + +
Related Topics
  • 贪心算法
  • \n
  • 👍 8
  • 👎 0
  • \ No newline at end of file