【每日一题Day129】LC1247交换字符使得字符串相同 | 贪心

交换字符使得字符串相同【LC1247】

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

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

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

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

考完一门 下周还有一门 加油哇

  • 思路

    当两种字符串某个位置字符不同时,有两种情况:

    • 第一种情况为s1[i]xs2[i]y,记该种情况次数为nXy
    • 第二种情况为s1[i]ys2[i]X,记该种情况次数为nYx

    交换的方法有两种

    1. 通过一次交换(x<->y 或者y<->x )使nXy或者nYx减少2
    2. 通过两次交换(x<->x x<->y 或者y<->y y<->x)使nXynYx各减少1

    如果nXynYx有一个为奇数,那么无法使字符串相等。否则优先采取第一种交换方式【局部最优】,然后当都只剩下一个时,通过两次交换使字符串相等,交换次数为 n X y / 2 + n Y x / 2 + n X y % 2 + n Y x % 2 nXy/2 + nYx/2+nXy\%2 + nYx\%2 nXy/2+nYx/2+nXy%2+nYx%2

  • 实现

    class Solution {
        public int minimumSwap(String s1, String s2) {
            int nX = 0, nY = 0;
            int n = s1.length();
            for (int i = 0; i < n; i++){
                if (s1.charAt(i) != s2.charAt(i)){
                    if (s1.charAt(i) == 'x'){
                        nX++;
                    }else{
                        nY++;
                    }
                }
            }
            int res = 0;
            res += nX / 2;
            if (nX % 2 == 1){
                res += 1;
                nY++;
            }
            if (nY % 2 == 1){
                return -1;
            }
            res += nY / 2;
            return res;
    
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n ) O(n) O(n)
      • 空间复杂度: O ( 1 ) O(1) O(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值