给你一个下标从 0 开始的字符串 word
,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word
中剩余每个字母出现 频率 相同。
如果删除一个字母后,word
中剩余所有字母的出现频率都相同,那么返回 true
,否则返回 false
。
注意:
- 字母
x
的 频率 是这个字母在字符串中出现的次数。 - 你 必须 恰好删除一个字母,不能一个字母都不删除。
示例 1:
输入:word = "abcc" 输出:true 解释:选择下标 3 并删除该字母,word 变成 "abc" 且每个字母出现频率都为 1 。
示例 2:
输入:word = "aazz" 输出:false 解释:我们必须删除一个字母,所以要么 "a" 的频率变为 1 且 "z" 的频率为 2 ,要么两个字母频率反过来。所以不可能让剩余所有字母出现频率相同。
提示:
2 <= word.length <= 100
word
只包含小写英文字母。- 1.可用枚举法。先遍历,求出每个字母出现的概率。再删除每一个字母,看各个频率是否相等。
- 2.使用枚举加哈希表
- 3.遍历加分类讨论。易得满足条件有4中。AAA,AACCC(多出现一次且出现的次数大比其他大1),ABC(各不相同),ABB(有一个单字母,其他字母出现的次数相同)没学过哈希表的想降低时间复杂度,可用三。本人以三为例。
-
bool equalFrequency(char * word){
int a[26]={0}, max, min=100, len=strlen(word), flag=0;
for(int i=0; i<len; i++)
{
a[word[i]-'a']++;
}
max = a[0];
for(int i=0; i<26; i++)
{
if(max < a[i])
{
max = a[i];
}
if(min > a[i]&&a[i]!=0)
{
min = a[i];
}
}
for(int i=0; i<26; i++)
{
if(a[i] == max)
{
flag++;
}
}
if(flag == 1&&max-min == 1)
{
return true;
}
if(max==1&&min==1)
{
return true;
}
if(max==len)
{
return true;
}
if (min==1&&max*flag+1==len)
{
return true;
}
else
{
return false;
}
}