1781. 所有子字符串美丽值之和

96 阅读1分钟

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

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

给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。
算法:
方法一:LFU
最大频率和最小频率的计算方法

func beautySum(s string) int {
    n := len(s)
    sum := 0
    // 保存同一频率字符的次数,如在子字符串中出现次数为3的有2个,freqCnt[3]=2
    
    for i := 0; i < n; i ++ {
        freqCnt := make([]int, 500)
        charFreq := make([]int, 26)
        minFreq, maxFreq := 0, 0
        for j := i; j < n; j ++ {
            index := s[j] - 'a'
            if charFreq[index]  == 0 {
                minFreq = 1
            // 当前字母是频率最小的,并且是唯一最小minFreq ++
            } else if freqCnt[charFreq[index]] == 1 && charFreq[index] == minFreq{
                minFreq ++
            }
            // 频率数量更新
            freqCnt[charFreq[index]] --
            charFreq[index] ++
            freqCnt[charFreq[index]] ++

            maxFreq = max(maxFreq, charFreq[index])
            sum = sum + maxFreq - minFreq
        }
    }
    return sum
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

方法二:暴力

func beautySum(s string) int {
    n := len(s)
    sum := 0
    for i := 0; i < n; i ++ {
        charFreq := make([]int, 26)
        for j := i; j < n; j ++ {
            charFreq[s[j] - 'a'] ++
            minFreq, maxFreq := 1000, 0
            for k := range charFreq {
                if charFreq[k] == 0 {
                    continue
                }
                if charFreq[k] < minFreq {
                    minFreq = charFreq[k] 
                } 
                if charFreq[k] > maxFreq {
                    maxFreq = charFreq[k] 
                }
            }
            sum = sum + maxFreq - minFreq
        }
    }
    return sum
}