题目:
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
- 比方说,
"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
}