2023-04-29每日一题
一、题目编号
2423. 删除字符使频率相同
二、题目链接
三、题目描述
给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。
如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。
注意:
字母 x 的 频率 是这个字母在字符串中出现的次数。
你 必须 恰好删除一个字母,不能一个字母都不删除。
四、解题代码
class Solution {
unordered_map<int, int> hash;
public:
bool equalFrequency(string word) {
int n = word.size();
for(int i = 0; i < n; ++i){
hash[ word[i] - 'a' ]++;
}
int m = hash.size();
if(m == 1){
return true;
}
if( (n-1) % m != 0 && (n-1) % (m-1) != 0){
return false;
}
int flag1 = 0;
int flag2 = 0;
int average1 = (n - 1) / m;
int average2 = (n - 1) / (m - 1);
if(average2 == 1){
return true;
}
int cnt = 0;
int index = 0;
for(auto iter = hash.begin(); iter != hash.end(); ++iter){
if(iter->second != average1){
++cnt;
index = iter->second;
}
}
if(cnt != 1 || index - 1 != average1){
flag1 = 1;
}
if(flag1 == 0){
cout<<"gg"<<endl;
return true;
}
int cnt1 = 0;
int index1 = 0;
for(auto iter = hash.begin(); iter != hash.end(); ++iter){
if(iter->second != average2){
cnt1++;
index1 = iter->second;
}
}
if(cnt1 != 1 || index1 != 1){
return false;
}
return true;
}
};
五、解题思路
(1) 首先先用哈希表存储每一个字母的出现频率。
(2) 用n记录单词的长度,用m记录字母出现的数量。下面将利用n和m来分别讨论两种不同的情况。
(3) 当n-1是m的倍数的时候,这个时候用average1记录n-1除以m的值,代表着删除一个字母后,剩余的每个字母数目都应该是average1个。这个时候只需要统计数目不等于average1的个数cnt 和 不等于average的值为多少。如果cnt不等于1则不可能为该种情况,如果值不为average1+1,则不可能为这种情况。
(4) 当n-1是m-1的倍数的时候,这个时候用average2记录n-1除以m-1的值,代表删除一个字母后,该字母就消失了,剩余的字母数目都应该是average2个。如果average2 = 1的话,那么每一个字母都是1个,随便删除1个都满足条件。然后需要统计数目不等于average2的个数cnt1,和记录不等于average2的值为多少。如果cnt1 > 1或者值不为1(删除不掉这种字母),则不符合要求。
(5) 如果经上述讨论没有输出false,则输出true即可。