LeetCode-1781. 所有子字符串美丽值之和【哈希表,字符串,计数】
题目描述:
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
比方说,“abaacc” 的美丽值为 3 - 1 = 2 。
给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。
示例 1:
输入:s = “aabcb”
输出:5
解释:美丽值不为零的字符串包括 [“aab”,“aabc”,“aabcb”,“abcb”,“bcb”] ,每一个字符串的美丽值都为 1 。
示例 2:
输入:s = “aabcbaa”
输出:17
提示:
1 <= s.length <= 500
s 只包含小写英文字母。
https://leetcode.cn/problems/sum-of-beauty-of-all-substrings/
解题思路一:简单暴力,双层循环。重点是分别记录子字符串【i,j】的最大最小频率。注意这里当i变的时候,所有字符出现的频率就清理,否则在原来的基础上加就行。
class Solution {
public:
int beautySum(string s) {
int ans=0,n=s.size();
for(int i=0;i<n;++i){
vector<int> cnt(26);//26个字母出现的频率
int maxFreq=0;//maxFreq刚开始肯定是0,后面每次取与增加的单词频率数取最大值
for(int j=i;j<n;++j){
++cnt[s[j]-'a'];
maxFreq=max(maxFreq,cnt[s[j]-'a']);
int minFreq=n;//每次取最大,然后遍历cnt取其中最小值
for(int& v:cnt)
if(v>0) minFreq=min(v,minFreq);
ans+=maxFreq-minFreq;
}
}
return ans;
}
};
时间复杂度:O(n2*C)n是s的长度,C=26
空间复杂度:O©
解题思路二:0
解题思路三:0