删除字符使频率相同

博客围绕一个字符串问题展开,需选择一个下标删除字符,使剩余字母出现频率相同。介绍了枚举法、枚举加哈希表、遍历加分类讨论三种解法,并给出了使用遍历加分类讨论的C#代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个下标从 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;

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值