2021/4/14
力扣第47场双周赛——虚拟竞赛
第三题 所有子字符串美丽值之和
力扣 1781
以下经验来自于对该题目的解决:
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
比方说,“abaacc” 的美丽值为 3 - 1 = 2 。 给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。
示例 1:
输入:s = “aabcb” 输出:5 解释:美丽值不为零的字符串包括
[“aab”,“aabc”,“aabcb”,“abcb”,“bcb”] ,每一个字符串的美丽值都为 1 。 示例 2:
输入:s = “aabcbaa” 输出:17
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-beauty-of-all-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本体目标在于对每个可能的子字符串进行一次“美丽值”的查找,而所需解决的关键点在于如何优化寻找使其不超时。
以下是我对“美丽值”的查找函数,是一段很弱智的查找方式
是一段很简朴,很入门的查找方式
for(int i=left;i<=right;i++){
if(hash[s[i]]>Max)Max=hash[s[i]];
if(hash[s[i]]<Min)Min=hash[s[i]];
}
但很不幸的是我的 弱智 简朴代码没能通过,它超时了。
在这种情况下我前往原题寻找解决方案,发现了力扣用户Hanxin的解题代码。
以下是力扣用户Hanxin的解题代码。
class Solution { public:
int beautySum(string s)
{
int n = s.size();
int res = 0;
for (int L = 0; L < n; L ++)
{
unordered_map<char, int> dic;
for (int R = L; R < n; R ++)
{
dic[s[R]] ++;
if (dic.size() > 0)
{
int min_ = 0x3f3f3f3f;
int max_ = -0x3f3f3f3f;
for (auto [c, freq]: dic)
{
min_ = min(min_, freq);
max_ = max(max_, freq);
}
res += (max_ - min_);
}
}
}
return res;
} };
作者:Hanxin_Hanxin
链接:https://leetcode-cn.com/problems/sum-of-beauty-of-all-substrings/solution/c-python3-ha-xi-zi-dian-tong-ji-bi-jiao-ypqor/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
他的代码和我的代码之间的核心区别在于寻找的方式,他的明显更高效,借此机会我也提升了自己的编程能力(Exp++)
for(auto [c,freq]:hash){
if(freq>Max)Max=freq;
if(freq<Min)Min=freq;
}
恭喜看到这里的你掌握了一种map的搜寻方式。