携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 >>
所有子字符串美丽值之和
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
- 比方说,"abaacc" 的美丽值为 3 - 1 = 2 。
给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。
示例1:
输入:s = "aabcb"
输出:5
解释:美丽值不为零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] ,每一个字符串的美丽值都为 1 。
示例2:
输入: s = "aabcbaa"
输出: 17
提示:
1 <= s.length <= 500s只包含小写英文字母。
解题思路:
在获取入参的直接子字符串的美丽值的同时, 获取每个间接子字符串的美丽值, 将他们相加即可。
我的答案:
/**
* @param {string} s
* @return {number}
*/
var beautySum = function(s) {
let res = 0
// 声明一个对象用来存放入参中每个字母出现的次数
let letterNum = {}
for (let i = 0; i < s.length; i++) {
letterNum[s[i]] = letterNum[s[i]] || 0
letterNum[s[i]]++
// 获取每个直接子字符串的美丽值
let min = Infinity
let max = -Infinity
for (let key in letterNum) {
min = Math.min(min, letterNum[key])
max = Math.max(max, letterNum[key])
}
res += max - min
// 将当前字母出现次数对象进行浅拷贝, 用来计算间接子字符串的美丽值
const tempObj = Object.assign({}, letterNum)
for(let j = 0; j < i; j++) {
// 此处的思路是, 以所属直接子字符串为基准, 每去掉一个字母, 就将改字母出现次数减去1, 然后计算当前间接子字符串美丽值
tempObj[s[j]]--
tempObj[s[j]] === 0 && delete tempObj[s[j]]
let min = Infinity
let max = -Infinity
for (let key in tempObj) {
min = Math.min(min, tempObj[key])
max = Math.max(max, tempObj[key])
}
res += max - min
}
}
return res
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )