有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同。
每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。
交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]。
最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/mi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 思路:
-
- 姑且让s1[i]位置的x和s2[i]位置的y为一组xy,让s1[i]位置的y和s2[i]位置的x为一组yx,
-
- 首先循环一遍找出xy和yx一共有多少组
-
- xy和yx的组合组数是奇数,那么直接返回-1,因为奇数的话剩下的那一组无法找到对应的与之交换
-
- 然后两组xy和两组yx组成一个矩阵,对角线交换即可,
- 4.如果有剩下的xy和yx直接取余数
/**
* @param {string} s1
* @param {string} s2
* @return {number}
*/
var minimumSwap = function (s1, s2) {
let xy = 0, yx = 0, L = s1.length;
for (let i = 0; i < L; i++) {
let a = s1[i], b = s2[i];
if (a == 'x' && b == 'y') {
xy++
}
if (a == 'y' && b == 'x') {
yx++
}
}
if ((xy + yx) % 2 == 1) {
return -1
}
return Math.floor(xy / 2) + Math.floor(yx / 2) + xy % 2 + yx % 2
};