[路飞]_leetcode-1647-字符频次唯一的最小删除次数

简介: leetcode-1647-字符频次唯一的最小删除次数

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


如果字符串 s不存在 两个不同字符 频次 相同的情况,就称 s优质字符串


给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最小 字符数。


字符串中字符的 频次 是该字符在字符串中的出现次数。例如,在字符串 "aab" 中,'a' 的频次是 2,而 'b' 的频次是 1


示例 1:


输入: s = "aab"
输出: 0
解释: s 已经是优质字符串。
复制代码


示例 2:


输入: s = "aaabbbcc"
输出: 2
解释: 可以删除两个 'b' , 得到优质字符串 "aaabcc" 。
另一种方式是删除一个 'b' 和一个 'c' ,得到优质字符串 "aaabbc" 。
复制代码


示例 3:


输入: s = "ceabaacb"
输出: 2
解释: 可以删除两个 'c' 得到优质字符串 "eabaab" 。
注意,只需要关注结果字符串中仍然存在的字符。(即,频次为 0 的字符会忽略不计。)
复制代码


提示:


  • 1 <= s.length <= 105
  • s 仅含小写英文字母


解题思路


本题要求字符串中不能出现频次相同的字符,所以首先我们要知道字符串中出现了哪些字符及其频次。


这里我们可以利用 map 记录出现字符及其频次,遍历输入字符串,获取出现字符及其频次。


然后将 map 转为数组并进行降序排序。最后针对排序后的数组,判断如果后面字符出现的频次大于前面字符的频次,则进行降频,并记录降频的次数。


最后处理完排序数组,降频次数就是我们要获取的最小删除次数。


代码实现


var minDeletions = function (s) {
  // 创建 map 记录出现的字符及其频次
  let map = new Map()
  // 遍历输入字符串,获取出现字符及其频次
  for (let i = 0; i < s.length; i++) {
    const item = s[i]
    if (map.has(item)) map.set(item, map.get(item) + 1)
    else map.set(item, 1)
  }
  // 将 map 转为 数组
  map = Array.from(map)
  // 对数组元素针对频次进行降序排序
  map.sort((a, b) => b[1] - a[1])
  // 初始化结果值为 0
  let res = 0
  // 遍历排序后的数组
  for (let i = 1; i < map.length; i++) {
    // 当后面字符的频次大于等于前面字符的频次的时候,对其进行降频,并记录降频次数
    while (map[i][1] > 0 && map[i][1] >= map[i - 1][1]) map[i][1]--, res++
  }
  // 返回结果值
  return res
}
复制代码


至此我们就完成了 leetcode-1647-字符频次唯一的最小删除次数


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
4月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
5月前
|
存储 算法 Java
LeetCode 无重复字符的最长子串 打败100%的人
LeetCode 无重复字符的最长子串 打败100%的人
63 0
|
5月前
|
存储 索引
LeetCode 387. 字符串中的第一个唯一字符
LeetCode 387. 字符串中的第一个唯一字符
19 0
|
4月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
40 0
|
4月前
|
Go
golang力扣leetcode 3.无重复字符的最长子串
golang力扣leetcode 3.无重复字符的最长子串
28 0
|
2月前
|
网络协议
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
|
3月前
|
存储 算法 Go
LeetCode 第三题: 无重复字符的最长子串
  给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
|
4月前
【Leetcode 2707】字符串中的额外字符 —— 动态规划
1. 状态定义:把`s[i−1]`当做是额外字符,`d[i] = d[i−1] + 1` 2. 状态转移方程:遍历所有的`j(j∈[0,i−1])`,如果子字符串`s[j...i−1]`存在于`dictionary`中,那么`d[i] = min d[j] 3. 初始状态`d[0] = 0`,最终答案为`d[n]`
|
4月前
leetcode:3. 无重复字符的最长子串
leetcode:3. 无重复字符的最长子串
17 0

热门文章

最新文章