You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

字符串字符频率一致性校验(允许删除一个字符)代码问题排查求助

问题排查与修正方案

我来帮你梳理下这段代码的问题,再给你调整后的正确版本~

你的代码存在的核心漏洞

当前逻辑只盯着「频率出现次数的差值」,完全忽略了频率本身的差值,这会导致大量测试用例判断错误:

  • 比如输入"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,符合要求。

修正后的判断逻辑

正确的逻辑需要同时关注频率的差值频率出现的次数两个维度:

  1. 如果所有字符的出现频率完全一致,直接返回YES
  2. 如果频率的统计结果只有两种,需要满足以下任一条件:
    • 其中一种频率是1,且这种频率只出现1次(删除这个唯一的单次字符即可)
    • 两种频率的差值是1,且其中一种频率只出现1次(删除一个该字符,让它的频率降到和另一种一致)
  3. 其他所有情况都返回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

火山引擎 最新活动