本文最后更新于256 天前,其中的信息可能已经过时,如有错误请发送邮件到2446865563@qq.com
1.题目基本信息
1.1.题目描述
给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。
如果删除一个字母后,word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。
注意:
-
字母 x 的 频率 是这个字母在字符串中出现的次数。
-
你 必须 恰好删除一个字母,不能一个字母都不删除。
1.2.题目地址
https://leetcode.cn/problems/remove-letter-to-equalize-frequency/description/
2.解题方法
2.1.解题思路
哈希表+模拟
2.2.解题步骤
第一步,统计单词中各个字符的频数charCnts数组
第二步,统计各个频数的频数freqCnts哈希表
第三步,遍历所有的字符及频数
-
3.1.剪枝。字符频数为空(不存在),跳过
-
3.2.将当前字符的频数减1
-
3.3.更新字符频数的频数哈希表freqCnts,原频数c的频数减一,如果频数减后为0,则需要从哈希表中删除;如果c-1大于0,则其对应频数加1
-
3.4.如果当前频数的频数哈希表freqCnts中只有一个元素,则说明情况合法,返回True
-
3.5.将当前字符的频数加1,进行恢复;同时恢复频数的频数哈希表freqCnts
第四步,如果上面的遍历过程中没有找到合法情况,则返回False
3.解题代码
python代码
class Solution:
def equalFrequency(self, word: str) -> bool:
# 思路:哈希表+模拟
# 第一步,统计单词中各个字符的频数charCnts数组
charCnts = [0] * 26
for c in word:
charCnts[ord(c) - ord('a')] += 1
# 第二步,统计各个频数的频数freqCnts哈希表
freqCnts = Counter([a for a in charCnts if a != 0])
# 第三步,遍历所有的字符
for i in range(26):
cnt = charCnts[i]
# 3.1.剪枝。字符频数为空(不存在),跳过
if cnt == 0:
continue
# 3.2.将当前字符的频数减1
charCnts[i] -= 1
# 3.3.更新字符频数的频数哈希表freqCnts,原频数c的频数减一,如果c-1大于0,则其对应频数加1;如果频数减后为0,则需要从哈希表中删除
freqCnts[cnt] -= 1
if freqCnts[cnt] == 0:
del freqCnts[cnt]
if cnt - 1 > 0:
freqCnts[cnt - 1] += 1
# 3.4.如果当前频数的频数哈希表freqCnts中只有一个元素,则说明情况合法,返回True
if len(freqCnts) == 1:
return True
# 3.5.将当前字符的频数加1,进行恢复;同时恢复频数的频数哈希表freqCnts
freqCnts[cnt] += 1
if cnt - 1 > 0:
freqCnts[cnt - 1] -= 1
if freqCnts[cnt - 1] == 0:
del freqCnts[cnt - 1]
charCnts[i] += 1
# 第四步,如果上面的遍历过程中没有找到合法情况,则返回False
return False
4.执行结果










