Sherlock and the Valid String

说明

来自HackerRank网站的一个编程练习题。

题目

  1. 描述
    一个字符串在两种情况下为一个有效字符串:
    字符串中所有的字符出现次数都相同;或者仅移除1个字符后剩余字符串中所有的字符出现次数都相同。
  2. 要求
    给定一个字符串,判断是否是有效字符串。
    例如:
    s=“zxc”,则s为有效字符串,因为字符z、x、c各出现1次。s="zxxc"同样为有效字符串,因为移除1个字符c之后,剩余字符串“zxc”为有效字符串。
  3. 格式
    输入格式
    字符串s
    输出格式
    如果s是有效字符串,打印YES。如果不是,打印NO。

代码

from collections import Counter


def valid_string(src_str):
    # 获取所有字符出现次数,字典,字符为键,次数为值。
    chr_dict = Counter(src_str)
    # 将字符出现次数列表排序,升序
    chr_nums = sorted(chr_dict.values())
    # 将列表转化为集合
    chrset_length = len(set(chr_nums))
    # 如果集合长度大于2,说明字符的出现次数存在3种以上,则字符串不可能是有效字符串,因为不可能通过只移除1个字符实现。
    if chrset_length > 2:
        return "NO"
    # 如果集合长度为2,字符的出现次数有两种,只有类似xxxy且y-x=1的情况下为有效字符串。
    elif chrset_length == 2:
        return "YES" if chr_nums[-1] == sum(chr_nums[:-1]) / len(chr_nums[:-1]) + 1 else "NO"
    # 如果长度为1,说明所有字符的出现次数都相同,字符串有效。
    else:
        return "YES"


if __name__ == '__main__':

    s = input()
    
    result = valid_string(s)

    print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值