网络异常,图片无法展示
|
「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
如果字符串 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-字符频次唯一的最小删除次数
如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻