题目描述:
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
比方说,“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:
主要思路:解题链接汇总
(1)滑动窗口;
(2)使用各个可能长度的滑动窗口去统计满足要求的美丽数;
class Solution {
public:
//长度为 k 的滑动窗口下,统计美丽数
int get_k(string&s, int k) {
int res = 0;
int cur_max = 0;
int cur_min = 10000;
vector<int> mp(26, 0);
for (int i = 0; i < k; ++i) {
++mp[s[i] - 'a'];
}
for (int&i : mp) {
cur_max = max(cur_max, i);
if (i != 0) {
cur_min = min(cur_min, i);
}
}
if (cur_min != 10000) {
res += cur_max - cur_min;
}
int left = 0, right = k;
while (right < s.size()) {
++mp[s[right] - 'a'];
--mp[s[left] - 'a'];
cur_max = 0;
cur_min = 10000;
for (int&i : mp) {
cur_max = max(cur_max, i);
if (i != 0) {
cur_min = min(cur_min, i);
}
}
if (cur_min != 10000) {
res += cur_max - cur_min;
}
++right;
++left;
}
return res;
}
int beautySum(string s) {
if (s.size() < 3) {
return 0;
}
int res = 0;
for (int i = 3; i <= s.size(); ++i) {
//统计各个长度的滑动窗口
res += get_k(s, i);
}
return res;
}
go语言实现
func max(lhs,rhs int)int{
if lhs>rhs {
return lhs
}
return rhs
}
func min(lhs,rhs int)int{
if lhs<rhs {
return lhs
}
return rhs
}
func get_k(s string,k int)int {
res :=0
cur_max := 0
cur_min := 10000
var mp [26]int
for i:=0;i<k;i++ {
mp[s[i]-'a']++
}
for _,v := range mp {
cur_max=max(cur_max,v)
if v!=0 {
cur_min=min(cur_min,v)
}
}
if cur_min!=10000 {
res += cur_max-cur_min
}
left :=0
right :=k
for right < len(s) {
mp[s[right]-'a']++
mp[s[left]-'a']--
cur_max=0
cur_min=10000
for _,v := range mp {
cur_max=max(cur_max,v)
if v!=0 {
cur_min=min(cur_min,v)
}
}
if cur_min!=10000 {
res += cur_max-cur_min
}
right++
left++
}
return res
}
func beautySum(s string) int {
if len(s)<3 {
return 0
}
res := 0
for i:=3;i<=len(s);i++ {
res+=get_k(s,i)
}
return res
}