title
给你一个二进制字符串 s ,现需要将其转化为一个 交替字符串 。请你计算并返回转化所需的 最小 字符交换次数,如果无法完成转化,返回 -1 。
交替字符串 是指:相邻字符之间不存在相等情况的字符串。例如,字符串 "010" 和 "1010" 属于交替字符串,但 "0100" 不是。
任意两个字符都可以进行交换,不必相邻 。
示例 1:
输入:s = "111000"
输出:1
解释:交换位置 1 和 4:"111000" -> "101010" ,字符串变为交替字符串。
示例 2:
输入:s = "010"
输出:0
解释:字符串已经是交替字符串了,不需要交换。
示例 3:
输入:s = "1110"
输出:-1
提示:
1 <= s.length <= 1000s[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) # 两个都换得了,返回交换次数较少的那个。