开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 13 天,点击查看活动详情。
所有子字符串美丽值之和
原题地址
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
比方说,"abaacc" 的美丽值为 3 - 1 = 2 。
给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。
示例 1:
输入:s = "aabcb"
输出:5
解释:美丽值不为零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] ,每一个字符串的美丽值都为 1 。
示例 2:
输入:s = "aabcbaa"
输出:17
提示:
1 <= s.length <= 500s只包含小写英文字母。
思路分析
- 根据题目,我们需要计算子字符串的美丽值之和,而对于美丽值为 0 的子字符串,其实对于最后的结果来说相加和不相加都没有太大影响;
- 因此我们进行双层遍历来寻找每个子字符串,然后分别计算其美丽值,叠加到 res 上;
- 内层循环的 j 值从外层循环的 i 值开始,为了将 s[i] 统计在内,使用一个 count 以键值对的形式来存储每个字符出现的次数,然后计算其最多出现的次数与最少出现的次数的差值,最后计算完毕后,可以得到对应的美丽值之和。
注: 计算字符串中每个字符出现的次数所使用的方法:一种是使用 map 以键值对的形式存储,s[i] 为键,出现的次数为值;另一种方法是可以构造一个含有26个字母(如果都是小写字母或者大写字母的情况是26个,都含的话就是52个)的数组来存储每个字符出现的次数。
AC 代码
/**
* @param {string} s
* @return {number}
*/
var beautySum = function(s) {
let res = 0
for (let i = 0; i < s.length; i++) {
const count = new Map()
for (let j = i; j < s.length; j++) {
count.set(s[j], (count.get(s[j]) || 0) + 1)
const values = Array.from(count.values())
res += Math.max(...values) - Math.min(...values)
}
}
return res
};
结果:
- 执行结果: 通过
- 执行用时:528 ms, 在所有 JavaScript 提交中击败了61.54%的用户
- 内存消耗:46.8 MB, 在所有 JavaScript 提交中击败了46.15%的用户
- 通过测试用例:57 / 57