贪心算法+滑动窗口
题目:
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
比方说,"abaacc" 的美丽值为 3 - 1 = 2 。
给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和
c++实现
class Solution {
public:
int beautySum(string s) {
int n = s.size(), sum = 0;
for(int len = 2; len <= n; ++len){
int r = 0, l = 0, minN = INT_MAX, maxN = INT_MIN;
vector<int> nums(26, 0); // 使用数组存储每个字符的数量
while(r < n){ // 滑动窗口
nums[s[r] - 'a']++; //右端点移入,增加
r++; //区间右端点移动
if(r - l == len){ //右端点减左端点等于区间长度,说明这个长度的区间已经极限了,去求美丽值
minN = INT_MAX;
maxN = INT_MIN;
for(int i = 0; i < 26; ++i){
if(nums[i] > 0){
minN = min(minN, nums[i]);
maxN = max(maxN, nums[i]);
}
}
sum += maxN - minN;
nums[s[l] - 'a']--; //左端点移出,减小
l++;
}
}
}
return sum;
}
};
java
class Solution {
public int beautySum(String s) {
int length=s.length();
int sum=0;
for(int k=3;k<=length;k++){
int l=0;
int r=0;
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
int[] count=new int[26];
while(r<length){
count[s.charAt(r)-'a']++;
r++;
while(l+k==r){
min=Integer.MAX_VALUE;
max=Integer.MIN_VALUE;
for(int i=0;i<26;i++){
if(count[i]>0){
min=Math.min(min,count[i]);
max=Math.max(max,count[i]);
}
}
sum+=max-min;
count[s.charAt(l)-'a']--;
l++;
}
}
}
return sum;
}
}