[路飞]_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-字符频次唯一的最小删除次数


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

相关文章
|
29天前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
57 0
Leetcode第三题(无重复字符的最长子串)
|
3月前
|
算法
LeetCode第3题无重复字符的最长子串
该文章介绍了 LeetCode 第 3 题无重复字符的最长子串的解法,通过使用 HashSet 记录不重复的子元素,以每个字符开头遍历字符串,遇到重复字符则重新计算,最终找到最长子串,同时提到可以考虑使用 HashMap 降低复杂度。
LeetCode第3题无重复字符的最长子串
|
5月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
5月前
|
存储 算法 数据可视化
深入解析力扣157题:用Read4高效读取N个字符(多种解法与详细图解)
深入解析力扣157题:用Read4高效读取N个字符(多种解法与详细图解)
|
4月前
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
31 0
|
5月前
|
存储 算法 程序员
力扣经典150题第三十一题:无重复字符的最长子串
力扣经典150题第三十一题:无重复字符的最长子串
31 0
|
5月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
5月前
|
存储 算法 数据可视化
深入解析力扣159题:至多包含两个不同字符的最长子串(滑动窗口法详细图解)
深入解析力扣159题:至多包含两个不同字符的最长子串(滑动窗口法详细图解)
|
5月前
|
存储 算法 数据挖掘
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
LeetCode 第三题:无重复字符的最长子串 详解 【3/1000】
|
5月前
|
存储 算法 Java
【经典算法】LeetCode 1170:比较字符串最小字母出现频次(Java/C/Python3实现含注释说明,中等)
【经典算法】LeetCode 1170:比较字符串最小字母出现频次(Java/C/Python3实现含注释说明,中等)
30 0