字符串字符频率一致性校验(允许删除一个字符)代码问题排查求助
问题排查与修正方案
我来帮你梳理下这段代码的问题,再给你调整后的正确版本~
你的代码存在的核心漏洞
当前逻辑只盯着「频率出现次数的差值」,完全忽略了频率本身的差值,这会导致大量测试用例判断错误:
- 比如输入
"aaaabbbbcc",字符频率是4,4,2,需要删除2个c才能让频率一致,但题目只允许删1个,应该返回NO,但你的代码会错误返回YES——因为你只看了频率出现次数是[2,1],计算1-1=0就直接判定符合条件,完全没考虑2和4的差值是2,远大于1。 - 再比如输入
"aaabbbcccd",频率是3,3,3,1,你的代码能正确返回YES;但如果输入"aaaaabbbbbcc",频率是5,5,2,这时候差值为3,应该返回NO,你的代码还是会错误返回YES。 - 另外,当频率统计的键顺序变化时,比如
count_freq是{3:1,2:2},你的代码取dat[1]-1=1,会错误返回NO,但实际上删除一个3次的字符就能让所有频率变成2,符合要求。
修正后的判断逻辑
正确的逻辑需要同时关注频率的差值和频率出现的次数两个维度:
- 如果所有字符的出现频率完全一致,直接返回
YES - 如果频率的统计结果只有两种,需要满足以下任一条件:
- 其中一种频率是
1,且这种频率只出现1次(删除这个唯一的单次字符即可) - 两种频率的差值是
1,且其中一种频率只出现1次(删除一个该字符,让它的频率降到和另一种一致)
- 其中一种频率是
- 其他所有情况都返回
NO
修正后的代码
from collections import Counter def isValid(s): # 统计每个字符的出现频率 char_counts = Counter(s) # 统计不同频率的出现次数 freq_counts = Counter(char_counts.values()) # 情况1:所有字符频率完全相同 if len(freq_counts) == 1: return "YES" # 情况2:只有两种不同频率,进一步判断 if len(freq_counts) == 2: f1, f2 = freq_counts.keys() # 子条件a:存在单次出现的字符,且仅出现一次 if (f1 == 1 and freq_counts[f1] == 1) or (f2 == 1 and freq_counts[f2] == 1): return "YES" # 子条件b:两种频率差值为1,且其中一种频率仅出现一次 if abs(f1 - f2) == 1 and (freq_counts[f1] == 1 or freq_counts[f2] == 1): return "YES" # 所有不符合要求的情况 return "NO"
测试用例验证
- 输入
"aabbcc"→ 频率均为2 → 返回YES - 输入
"aabbccd"→ 频率2,2,2,1 → 返回YES - 输入
"aaabbbcccdd"→ 频率3,3,3,2 → 返回YES(删除一个d即可) - 输入
"aaaabbbbcc"→ 频率4,4,2 → 返回NO(需要删除2个c,超出限制) - 输入
"a"→ 频率1 → 返回YES - 输入
"abb"→ 频率1,2 → 返回YES(删除一个b)
内容的提问来源于stack exchange,提问作者user9262680




