2023-04-29 LeetCode每日一题(删除字符使频率相同)

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即可。

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,数据结构)