力扣刷题日记-1247. 交换字符使得字符串相同

239 阅读1分钟

有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同。

每次「交换字符」的时候,你都可以在两个字符串中各选一个字符进行交换。

交换只能发生在两个不同的字符串之间,绝对不能发生在同一个字符串内部。也就是说,我们可以交换 s1[i] 和 s2[j],但不能交换 s1[i] 和 s1[j]。

最后,请你返回使 s1 和 s2 相同的最小交换次数,如果没有方法能够使得这两个字符串相同,则返回 -1 。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/mi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 思路:
    1. 姑且让s1[i]位置的x和s2[i]位置的y为一组xy,让s1[i]位置的y和s2[i]位置的x为一组yx,
    1. 首先循环一遍找出xy和yx一共有多少组
    1. xy和yx的组合组数是奇数,那么直接返回-1,因为奇数的话剩下的那一组无法找到对应的与之交换
    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
};