2423.删除字符使频率相同
链接:2423.删除字符使频率相同
难度:Easy
标签:哈希表、字符串、计数
简介:给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。
题解 1 - cpp
- 编辑时间:2023-04-29
- 内存消耗:6MB
- 编程语言:cpp
- 解法介绍:模拟。
class Solution {
public:
    bool equalFrequency(string word) {
        int cnt[26] = {0};
        for (auto &c : word) cnt[c - 'a']++;
        map<int, vector<int>> m;
        for (int i = 0; i < 26; i++) 
            if (cnt[i]) m[cnt[i]].push_back(i);
        // 如果都是一个频率,只有在频率都是1或者数量为1的时候才可以
        if (m.size() == 1) return m.begin()->first == 1 || m.begin()->second.size() == 1;
        // 超过两个频率就报错
        if (m.size() != 2) return false;
        int pi = -1;
        vector<int> pl;
        for (auto &item : m) {
            int ci = item.first;
            vector<int> cl = item.second;
            if (pi == -1) pi = ci, pl = cl;
            // 如果有一个频率是1且数量是1, 可以直接删
            else if (pi == 1 && pl.size() == 1 || ci == 1 && cl.size() == 1) return true;
            // 如果两个频率不差1, 就报错
            else if (pi + 1 != ci) return false;
            // 如果高频率不是只有1个,就报错
            else if (cl.size() != 1) return false;
        }
        return true;
    }
};