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

【每日一题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有一个为奇数,那么无法使字符串相等。否则优先采取第一种交换方式【局部最优】,然后当都只剩下一个时,通过两次交换使字符串相等,交换次数为nXy/2+nYx/2+nXy%2+nYx%2nXy/2 + nYx/2+nXy\%2 + nYx\%2nXy/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)
http://www.lryc.cn/news/19958.html

相关文章:

  • 性能优化之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试题每日一练之龟兔赛跑预测
  • 为你的Vue2.x老项目安装Vite发动机吧
  • ZCMU--5012: 铺设道路(差分思路)
  • 算法模板总结(自用)
  • 【架构师】零基础到精通——架构发展
  • C++(20):三路比较运算符
  • MySQL workbench 字符集、字符序的概念与联系
  • DBA之路---数据库启动与关闭过程
  • Shell文件包含
  • 计算机网络(六): HTTP,HTTPS,DNS,网页解析全过程
  • Android仿京东金融的数值滚动尺功能
  • Nginx 和 Tomcat 实现负载均衡
  • 【万能排序之qsort、b_sort 、s_sort】