【LeetCode 每日一题】2423. 删除字符使频率相同

178 阅读1分钟

2423. 删除字符使频率相同

难度:简单

时间:2023/04/29


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

解题思路:

计数 & 枚举

我们先用哈希表Countercnt 统计字符串中每个字母出现的次数。

然后枚举 26 个字母,如果字母 c 在字符串中出现过,我们将其出现次数减一,然后判断剩余的字母出现次数是否相同。如果相同,返回 true,否则将 c 的出现次数加一,继续枚举下一个字母。如果剩余字符的出现次数不相同,则继续遍历。

 class Solution:
     def equalFrequency(self, word: str) -> bool:
         cnt = Counter(word)
         for k in cnt.keys():
             cnt[k] -= 1
             if len(set(x for x in cnt.values() if x > 0)) == 1:
                 return True
             cnt[k] += 1
         return False

C++采用cnt[26]数组计数即可,使用set判重

 class Solution {
 public:
     bool equalFrequency(string word) {
         vector<int> cnt(26, 0);
         for (auto c : word) {
             cnt[c - 'a'] += 1;
         }
         
         for (int i = 0; i < 26; i++) {
             if (cnt[i] == 0) {
                 continue;
             }
             cnt[i] --;
             set<int> st;
             for (auto x : cnt) {
                 if (x > 0) {
                     st.insert(x);
                 }
             }
             if (st.size() == 1) {
                 return true;
             }
             cnt[i] ++;
         }
         return false;
     }
 };