当前位置: 首页 > news >正文

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

来源:力扣(LeetCode)

描述:

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

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

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

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

示例 1:

输入:s1 = "xx", s2 = "yy"
输出:1
解释:
交换 s1[0] 和 s2[1],得到 s1 = "yx",s2 = "yx"

示例 2:

输入:s1 = "xy", s2 = "yx"
输出:2
解释:
交换 s1[0] 和 s2[0],得到 s1 = "yy",s2 = "xx" 。
交换 s1[0] 和 s2[1],得到 s1 = "xy",s2 = "xy" 。
注意,你不能交换 s1[0] 和 s1[1] 使得 s1 变成 "yx",因为我们只能交换属于两个不同字符串的字符。

示例 3:

输入:s1 = "xx", s2 = "xy"
输出:-1

示例 4:

输入:s1 = "xxyyxyxyxx", s2 = "xyyxyxxxyx"
输出:4

提示:

  • 1 <= s1.length, s2.length <= 1000
  • s1, s2 只包含 ‘x’ 或 ‘y’。

方法:贪心

思路

同时遍历两个字符串,比较相同下标下,两个字符串的字符,如果相同,则该下标的字符不需要进行交换。如果不相同,则有两种情况,一是 s1[i] 为 “x”,s2[i] 为 “y”,用 xy 表示这种情况出现的次数。另一种情况是 s1[i] 为 “y”,s2[i] 为 “x”,用 yx 表示这种情况出现的次数。现在需要通过最少次数的交换,使得 xy 和 yx 都为 0。交换的方法有两种:

  • 示例 1:可以通过一次交换,使得 xy yx 的值减少 2。
  • 示例 2:可以通过两次交换,使得 xy yx 的值各减少 1。

为了使用尽可能少的交换次数,需要从以下顺序考虑:

  1. 第一种交换方式更有效率,应该尽可能采用第一种交换方式。
  2. 如果还未能使 xy 和 yx 都为 0,则应该采用第二种交换方式。
  3. 如果 xy 和 yx 都为 1,则可以通过两次第二种交换,来使得 xy 和 yx 都为 0,否则不能使 xy 和 yx 都为 0。这里也可以预先判断,如果 xy 和 yx 之和为奇数,则没有方法能够使得字符串相等。

代码:

class Solution {
public:int minimumSwap(string s1, string s2) {int xy = 0, yx = 0;int n = s1.size();for (int i = 0; i < n; i++) {char a = s1[i], b = s2[i];if (a == 'x' and b == 'y') {xy++;}if (a == 'y' and b == 'x') {yx++;}}if ((xy + yx) % 2 == 1) {return -1;}return xy / 2 + yx / 2 + xy % 2 + yx % 2;}
};

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6 MB, 在所有 C++ 提交中击败了93.67%的用户
复杂度分析
时间复杂度:O(n),其中 n 是字符串的长度。需要遍历两个字符串一遍。
空间复杂度:O(1),只需要常数空间。
author:LeetCode-Solution

http://www.lryc.cn/news/19972.html

相关文章:

  • 【一天一门编程语言】Lisp 语言程序设计极简教程
  • 全后端交互数据加密
  • 稀疏特征和密集特征
  • Linux网络TCP sticky分析工具
  • 华为OD机试题,用 Java 解【DNA 序列】问题
  • python的所有知识点+代码+注释,不看就亏死了
  • 读懂分布式事务
  • 多目标粒子群算法求解帕累托前沿Pareto,Pareto的原理,测试函数100种求解之21
  • 数组:二分查找、移除数组等经典数组题
  • 负责任动物纤维标准RAF
  • storybook使用info插件报错
  • 【每日一题Day129】LC1247交换字符使得字符串相同 | 贪心
  • 性能优化之node中间件耗时
  • 3-1 图文并茂说明raid0,raid1, raid10, raid01, raid5等原理
  • 西北工业大学大学物理(I)下2019-2020选填考题解析
  • 自动化测试selenium
  • 熟悉GC常用算法,熟悉常见垃圾收集器,具有实际JVM调优实战经验
  • 常量和变量——“Python”
  • 《蓝桥杯每日一题》KMP算法·AcWing 141. 周期
  • URL介绍
  • 学习 Python 之 Pygame 开发魂斗罗(一)
  • ARM uboot 源码分析8 - uboot的环境变量
  • 【蓝牙mesh】Network协议层介绍
  • 基于遗传算法的配电网故障定位(Matlab代码实现)
  • Leetcode.1247 交换字符使得字符串相同
  • python语音识别whisper
  • Prometheus -- 浅谈Exporter
  • 如何确定RocketMQ中消费者的线程大小
  • OpenAPI SDK组件之Spring Aop源码拓展
  • 蓝桥杯C/C++VIP试题每日一练之龟兔赛跑预测