欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

文章目录

  • 题目描述
  • 题目剖析&信息挖掘
  • 解题思路
    • 方法一 枚举+贪心
      • 分析
      • 思路
      • 注意
      • 知识点
      • 复杂度
      • 代码实现
    • 相关题目

题目描述

[1737] 满足三条件之一需改变的最少字符数

  • https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/

给你两个字符串 a 和 b ,二者均由小写字母组成。一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。

操作的最终目标是满足下列三个条件 之一 :

a 中的 每个字母 在字母表中 严格小于 b 中的 每个字母 。
b 中的 每个字母 在字母表中 严格小于 a 中的 每个字母 。
a 和 b 都 由 同一个 字母组成。
返回达成目标所需的 最少 操作数。

示例 1:

输入:a = “aba”, b = “caa”
输出:2
解释:满足每个条件的最佳方案分别是:

  1. 将 b 变为 “ccc”,2 次操作,满足 a 中的每个字母都小于 b 中的每个字母;
  2. 将 a 变为 “bbb” 并将 b 变为 “aaa”,3 次操作,满足 b 中的每个字母都小于 a 中的每个字母;
  3. 将 a 变为 “aaa” 并将 b 变为 “aaa”,2 次操作,满足 a 和 b 由同一个字母组成。
    最佳的方案只需要 2 次操作(满足条件 1 或者条件 3)。
    示例 2:

输入:a = “dabadd”, b = “cda”
输出:3
解释:满足条件 1 的最佳方案是将 b 变为 “eee” 。

提示:

1 <= a.length, b.length <= 105
a 和 b 只由小写字母组成

Related Topics
  • 枚举
  • 贪心

题目剖析&信息挖掘

此题主要用枚举思想,将复杂问题简化,再利用贪心思想求解。

赛中没有想到枚举,只想着直接求出最优解,要考虑的情况复杂。

给了一个启发是以后遇到范围型的题目最优范围是固定的,模板小的情况下可以尝试枚举思路。

解题思路

方法一 枚举+贪心

分析

分成2类讨论,一类是全部变成相同的
二类是有一个串变成大的,另一个变成小的
枚举思想
一类来说最终的字母肯定是已经出现过的一个,可以贪心直接求得,也可以使用枚举。
二类,枚举一个中间值,使得一个都小于等于这个中间值,另一个大于这个中间值。
复杂度26*O(n)

思路

func max(a, b int) int {if a > b {return a}return b
}func min(a, b int) int {if a < b {return a}return b
}func getCnt(a string) []int {cnt := make([]int, 200)for _, c := range a {cnt[c]++}return cnt
}// 贪心求解变成同一个字母的代价
func sameCost(cnta []int, cntb []int) int {}// 以mid为中点,使得cnta<=mid<cntb
func diffCost(cntoa []int, cntob []int, mid int32) int {}/*
分成2类讨论,一类是全部变成相同的
二类是有一个串变成大的,另一个变成小的
枚举思想
一类来说可以直接求得
二类,枚举一个中间值,使得一个都小于等于这个中间值,另一个大于这个中间值。
复杂度26*O(n)*/
func minCharacters(a string, b string) int {cnta := getCnt(a)cntb := getCnt(b)best := sameCost(cnta, cntb)for c :='a';c<'z';c++ { // mid = z时没有答案所以不用枚举}return best
}

注意

  • mid = z时不可能成立
  • 题目中说的相同字母是指2个串都用同一个字母

知识点

  • 枚举
  • 贪心

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

代码实现

func max(a, b int) int {if a > b {return a}return b
}func min(a, b int) int {if a < b {return a}return b
}func getCnt(a string) []int {cnt := make([]int, 200)for _, c := range a {cnt[c]++}return cnt
}// 贪心求解变成同一个字母的代价
func sameCost(cnta []int, cntb []int) int {sum := 0 // 总数maxCost := 0 // 存储数量最多的字母总数for i, v := range cnta {sum += v+cntb[i]maxCost = max(maxCost, v+cntb[i])}return sum - maxCost // 都往数量最多的字母转化为最优答案
}// 以mid为中点,使得cnta<=mid<cntb
func diffCost(cntoa []int, cntob []int, mid int32) int {sum:=0// 把cntoa>mid的字母变成<=midfor c:=mid+1; c<='z';c++ {sum += cntoa[c]}// 把cntob <= mid的字母变成>midfor c:=mid; c>='a';c-- {sum += cntob[c]}return sum
}/*
分成2类讨论,一类是全部变成相同的
二类是有一个串变成大的,另一个变成小的
枚举思想
一类来说可以直接求得
二类,枚举一个中间值,使得一个都小于等于这个中间值,另一个大于这个中间值。
复杂度26*O(n)*/
func minCharacters(a string, b string) int {cnta := getCnt(a)cntb := getCnt(b)best := sameCost(cnta, cntb)for c :='a';c<'z';c++ { // mid = z时没有答案所以不用枚举best = min(best, diffCost(cnta, cntb, c))best = min(best, diffCost(cntb, cnta, c))}return best
}

相关题目

https://leetcode-cn.com/problems/latest-time-by-replacing-hidden-digits/


本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

1737 - 满足三条件之一需改变的最少字符数 - 枚举 - 贪心相关推荐

  1. LeetCode——1737. 满足三条件之一需改变的最少字符数(Change Minimum Characters to Satisfy One of Three...)——分析及代码(Java)

    LeetCode--1737. 满足三条件之一需改变的最少字符数[Change Minimum Characters to Satisfy One of Three Conditions]--分析及代 ...

  2. 1737 满足三条件之一需改变的最少字符数

    题目描述: 给你两个字符串 a 和 b ,二者均由小写字母组成.一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 . 操作的最终目标是满足下列三个条件 之一 : a 中的 每个字 ...

  3. LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个字符串 a 和 b ,二者均由小写字母组成. 一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 . 操作的最终目标是满足下列 ...

  4. leetcode 1737. 满足三条件之一需改变的最少字符数

    题目:https://leetcode-cn.com/problems/change-minimum-characters-to-satisfy-one-of-three-conditions/ 思路 ...

  5. Leetcode-1737-满足三条件之一需改变的最少字符数

    题目 给你两个字符串 a 和 b ,二者均由小写字母组成.一步操作中,你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 . 操作的最终目标是满足下列三个条件 之一 : a 中的 每个字母 在 ...

  6. 计算机控制电梯如需改变功能 则,电梯维修项目教程 教学课件 作者 孙文涛附加答案试卷综合实训三模拟试题(13).doc...

    PAGE 5 深圳高级技工学校2011-2012学年第二学期 <电梯综合实训三>理论模拟试题(13) : 号 学 : 级 班 : 名 姓 ┄ ┄ ┄ ┄一一 ┄ ┄┄ ┄┄┄ 线 此 过 ...

  7. Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式

    Android App监听软键盘按键的三种方式与改变软键盘右下角确定键样式 actionNone : 回车键,按下后光标到下一行 actionGo : Go, actionSearch : 放大镜 a ...

  8. Oracle 以当前时间为准,取前三个小时后两个小时的分钟枚举

    /*以当前时间为准,取前三个小时后两个小时的分钟枚举*/ with x as( select 开始时间+level * 1/24/60 as 分钟from (select sysdate+2/24 a ...

  9. shell统计每一行字符数的三种方法

    shell统计每一行字符数的三种方法 $cat test.txt SlNAC2 ,SlNAC2_2 ,SlNAC2_2 ##### 方法一: $awk -F "" '{print ...

最新文章

  1. MySQL 笔记5 -- 多表查询
  2. sql server中的go
  3. 今天的我家有12口人的即时通讯
  4. javaweb实训第三天上午——Servlet
  5. Linux-lamp
  6. C#类对象转换成XML
  7. labview入门系列2
  8. 阿里easyExcel学习笔记(maven)
  9. 等比数列求和公式、性质
  10. qt打开xls文件_Qt读取excel文件的两种方法
  11. dither技术的原理及应用
  12. A Survey on Knowledge Graphs___Representation, Acquisition and Applications.知识图谱综述:表示,获取,应用
  13. 谷歌,被尘封的过去!
  14. spring mvc Discus
  15. 数分钟完成报销 SAP Concur帮助开德阜实现高效费用管理
  16. 坯子库无法一键安装插件没用_坯子插件库:安装与使用
  17. 在配置Intel realsense (D435i)时遇到的问题(转载)
  18. canvas离线画板画图
  19. 新概念英语 学习 阶段总结
  20. web服务器、Web中间件和Web容器的区别(转载)

热门文章

  1. 内存碎片产生原因及处理
  2. java确认对话框否_如何在Swing中显示是/否和取消选项的确认对话框?
  3. Hadoop常见端口号及配置文件
  4. 小姐姐都在用的25+技术站点
  5. ESD静电二极管选型需要关注的要点在哪里?
  6. python将panadas写入excel_python pandas写入excel文件的方法示例
  7. iOS底层基础知识-文件目录结构
  8. 推荐一个有趣的Flash小游戏——FlashElementTD
  9. 鸿蒙系统 规划,华为发布鸿蒙系统,青岛华为基地规划布局
  10. c编程语言外文翻译及原文,面向对象和C语言-外文文献译文-Object-Orientation and C语言编程外文文献及中文翻译...