LeetCode Everyday - 所有子字符串美丽值之和

185 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 >>

所有子字符串美丽值之和

一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。

  • 比方说,"abaacc" 的美丽值为 3 - 1 = 2 。

给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。

示例1:

输入:s = "aabcb"
输出:5
解释:美丽值不为零的字符串包括 ["aab","aabc","aabcb","abcb","bcb"] ,每一个字符串的美丽值都为 1

示例2:

输入: s = "aabcbaa"
输出: 17

提示:

  • 1 <= s.length <= 500
  • s 只包含小写英文字母。

解题思路:

在获取入参的直接子字符串的美丽值的同时, 获取每个间接子字符串的美丽值, 将他们相加即可。

我的答案:

/**
 * @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
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )