题目链接:[1247. 交换字符使得字符串相同]
方法:找规律
解题思路
由于只能两个字符串之间交换字符,单个字符串内不允许交换,因此如果只有一个字符对不相同,那么一定无法通过交换变为相同字符串,同理当不相同的字符对为奇数时,也无法通过交换变为相同字符。
当不相同的字符对数为偶数时,现在考虑以下几种情况:
其中对于情况1和2,两个不同的字符对可以通过1次替换变得相同,而情况3需要通过另一对字符对作为媒介才能替换相同,需要2次,所以优先情况1和2进行替换,当情况1和2替换之后,若只剩下1个字符对不同,则返回-1,若剩下一对情况3的字符对,此时替换次数+2即可。
代码
class Solution {
public:
int minimumSwap(string s1, string s2) {
int cnt['z']{}; // cnt['x'] 表示不相等的字符对中属于s1的字符为x的数量
for (int i = 0; i < s1.length(); i ++ ) {
if (s1[i] != s2[i]) cnt[s1[i]] ++ ;
}
if (cnt['x'] % 2 + cnt['y'] % 2 == 1) return -1;
return cnt['x'] / 2 + cnt['y'] / 2 + cnt['x'] % 2 + cnt['y'] % 2;
}
};
复杂度分析
时间复杂度:\(O(n),n = s.length()\);
空间复杂度:\(O(1)\)。