说明
来自HackerRank网站的一个编程练习题。
题目
- 描述
一个字符串在两种情况下为一个有效字符串:
字符串中所有的字符出现次数都相同;或者仅移除1个字符后剩余字符串中所有的字符出现次数都相同。 - 要求
给定一个字符串,判断是否是有效字符串。
例如:
s=“zxc”,则s为有效字符串,因为字符z、x、c各出现1次。s="zxxc"同样为有效字符串,因为移除1个字符c之后,剩余字符串“zxc”为有效字符串。 - 格式
输入格式
字符串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)