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

简介: 【每日一题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

image.png

实现

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 ( 1 )
目录
相关文章
|
7月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
41 0
|
7月前
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
【每日一题Day225】LC2559统计范围内的元音字符串数 | 前缀和 二分查找
54 0
|
7月前
【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp
【每日一题Day161】LC1641统计字典序元音字符串的数目 | 数位dp
54 0
|
7月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
57 0
|
7月前
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
【每日一题Day159】LC1638统计只差一个字符的子串数目 | 枚举
43 0
|
算法
【代码随想录】LC 209. 长度最小的子数组
利用两层循环,第一层循环枚举子数组的起点位置,第二层循环枚举子数组的终点位置,第二层循环中可以同时来统计当前子数组的和,如果符合题目条件则更新length,否则继续循环,直至两层循环结束,返回题目要求的值,算法结束。
64 0
|
7月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
55 0
|
7月前
|
机器人 Java
每日一刷《剑指offer》字符串篇之第一个只出现一次的字符
每日一刷《剑指offer》字符串篇之第一个只出现一次的字符
74 0
每日一刷《剑指offer》字符串篇之第一个只出现一次的字符
|
7月前
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
【每日一题Day368】LC421数组中两个数的最大异或值 | 字典树
34 0
|
7月前
【每日一题Day238】LC1177构建回文串检测 | 前缀和 + 异或
【每日一题Day238】LC1177构建回文串检测 | 前缀和 + 异或
67 0