LeetCode 每日 1 题:所有子字符串美丽值之和

180 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 13 天,点击查看活动详情

所有子字符串美丽值之和

原题地址

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

比方说,"abaacc" 的美丽值为 3 - 1 = 2 。 给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。

示例 1:

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

示例 2:

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

提示:

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

思路分析

  1. 根据题目,我们需要计算子字符串的美丽值之和,而对于美丽值为 0 的子字符串,其实对于最后的结果来说相加和不相加都没有太大影响;
  2. 因此我们进行双层遍历来寻找每个子字符串,然后分别计算其美丽值,叠加到 res 上;
  3. 内层循环的 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

END