1864. 构成交替字符串需要的最小交换次数

2021/05/23 leetcode 共 929 字,约 3 分钟

title

problem link

给你一个二进制字符串 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'

solution

对于一个size已知的字符串,交替字符串其实只有两种情况

s0(start with 0):0101010101…… s1(start with 1):1010101010……


class Solution:
    def minSwaps(self, s: str) -> int:
        '''
        s0: 1010..
        s1: 0101..
        only these cases
        :param s:
        :return:
        '''
        if not s: return 0
        n0, n1 = s.count('0'), s.count('1')
        inf = float('inf')
        res = inf
        # 对于s0来说,这个位得是0
        s0n0, s0n1, s1n0, s1n1 = 0, 0, 0, 0
        for i, c in enumerate(s):
            if i % 2 == 0:
                if c == '0':
                    s0n0 += 1
                else:
                    s1n1 += 1
            else:
                if c == '0':
                    s1n0 += 1
                else:
                    s0n1 += 1

        print(s0n0, s0n1, s1n0, s1n1)
        if (s0n0 != s0n1 and s1n0 != s1n1):
            return -1  # s0 s1 都换不了,返回-1
        if (s0n0 == s0n1 and s1n0 != s1n1):
            return s0n0  # s0 换得了,返回s0
        if (s0n0 != s0n1 and s1n0 == s1n1):
            return s1n0  # s1 换得了,返回s1
        return min(s0n0, s1n0)  # 两个都换得了,返回交换次数较少的那个。

Search

    Table of Contents