力扣——2423. 删除字符使频率相同

126 阅读1分钟

力扣——2423. 删除字符使频率相同

2423. 删除字符使频率相同

给你一个下标从 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 只包含小写英文字母。

问题解析

枚举所有的位置,假设删除的是当前枚举的位置,然后我们再计算其他字符的出现次数,如果出现次数都一样,就说明可以通过只删除一个字符使得所有字符的出现次数都相同。如果枚举完所有位置后,还是没有出现次数都一样的情况,说明不可以通过只删除一个字符使得所有字符的出现次数都相同。

AC代码

class Solution {
public:
    bool equalFrequency(string word) {
        int n=word.size();
        for(int i=0;i<n;i++)
        {
            unordered_map<char,int>mymap2;
            for(int j=0;j<n;j++)
            {
                if(i==j)continue;
                mymap2[word[j]]++;
            }
            int ans=0;
            bool flag=true;
            for(auto&j:mymap2)
            {
                if(ans==0)ans=j.second;
                else if(ans!=j.second)
                {
                    flag=false;
                    break;
                }
            }
            if(flag)return true;
        }
        return false;
    }
};

也可以优化一下,只用计算一次出现次数,然后枚举删除位置的时候,把对应的字符的出现次数减少一次即可。

AC代码

class Solution {
public:
    bool equalFrequency(string word) {
        int n=word.size();
        unordered_map<char,int>mymap2;
        for(int j=0;j<n;j++)
            {
                mymap2[word[j]]++;
            }
        for(int i=0;i<n;i++)
        {
            mymap2[word[i]]--;
            if(mymap2[word[i]]==0)mymap2.erase(word[i]);
            int ans=0;
            bool flag=true;
            for(auto&j:mymap2)
            {
                if(ans==0)ans=j.second;
                else if(ans!=j.second)
                {
                    flag=false;
                    break;
                }
            }
            mymap2[word[i]]++;
            if(flag)return true;
        }
        return false;
    }
};