题目:
给你一个二进制字符串 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'
代码:
class Solution {
public:
int minSwaps(string s) {
int n=s.size();
int n0=count(s.begin(),s.end(),'0');
int n1=count(s.begin(),s.end(),'1');
int res=INT_MAX;
//"1010..."
if(n1==(n+1)/2&&n0==n/2){
int diff1=0;
for(int i=0;i<n;i++){
if(s[i]-'0'==i%2){
++diff1;
}
}
res=min(res,diff1/2);
}
if(n0==(n+1)/2&&n1==n/2){
int diff2=0;
for(int i=0;i<n;i++){
if(s[i]-'0'!=i%2){
++diff2;
}
}
res=min(res,diff2/2);
}
if(res==INT_MAX){
return -1;
}else return res;
}
};
想法:
这道题不是从问题入手,而是从转变后的结果入手;总共有3个提示:
提示1——
符合要求的交替字符串的形式只有两种:
1. 形如"1010..."的字符串,奇数位为"0",偶数位为"1";
2. 形如"0101..."的字符串,奇数位为"1",偶数位为"0";
提示2——
二进制源字符串s1和目标字符串s2可以通过交换操作互相转化,当且仅当两个字符串中'0'和'1'的个数均相等;
提示3——
假设s1和s2可以通过交换操作互相转化,且他们有k个位置不同,那么最小的交换次数为k/2;