1247. 交换字符使得字符串相同

题目链接:[1247. 交换字符使得字符串相同]

方法:找规律

解题思路

由于只能两个字符串之间交换字符,单个字符串内不允许交换,因此如果只有一个字符对不相同,那么一定无法通过交换变为相同字符串,同理当不相同的字符对为奇数时,也无法通过交换变为相同字符。
当不相同的字符对数为偶数时,现在考虑以下几种情况:
无标题.png
其中对于情况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)\)

posted @ 2023-04-08 18:04  lixycc  阅读(34)  评论(0)    收藏  举报