11届省赛python试题 G: 重复字符串

试题 G: 重复字符串

【问题描述】
如果一个字符串 S 恰好可以由某个字符串重复 K 次得到,我们就称 S 是 K 次重复字串。例如 “abcabcabc” 可以看作是 “abc” 重复 3 次得到,所以“abcabcabc” 是 3 次重复字符串。
同理 “aaaaaa” 既是 2 次重复字符串、又是 3 次重复字符串和 6 次重复字符串。
现在给定一个字符串 S,请你计算最少要修改其中几个字符,可以使 S 变为一个 K 次字符串?
【输入格式】
输入第一行包含一个整数 K。
第二行包含一个只含小写字母的字符串 S。
【输出格式】
输出一个整数代表答案。如果 S 无法修改成 K 次重复字符串,输出 1。
【样例输入】
2
aabbaa
【样例输出】
2

思路:
因为他是要求重复字符串,len(s)%k!=0 就无法完成上述要求那么就输出1。我们想把S 修改成 K 次重复字符串,就是求最优解,我可以先分成k份来看字符,意思就是让k份是一样的字符。
如何以最少修改字符呢?
在这里插入图片描述

我们可以把每份的对应一列的字符存储到d列表中,那么我们如何把每份对应列存储起来呢?
我们可以看每份的字符串长度为多少,m=len(s)//k ,所以我们就可以把那个看成m列长度的d。q求每一列就可以利用for循环来完成,比如:
for i in range(0,10,3):
i依次为 0,3,6,9

我们想要修改字符最少,那么就是每列的修改次数最少,我们从中可以看到如果一列中每个字母出现次数越多那么我们就可以修改成那个最多的字母,
可以用 get 计数并用 sort 排序就可以得到,这样我们的修改次数就是最小,所以我们就把当前这列的出现次数最多的字符找出来然后这个列的长度减去最多次数就是修改次数最少c+=k-max(x),因为我们只算出一列的,然后在算出剩余列的相加就可以得到对应解了。

程序:

k=int(input())
s=input()
q1=0   #总修改次数
m=len(s)//k
if len(s)%k!=0:
     print("1")
else:
     for i in range(m):   #依次历遍列
          d={}
          for j in range(i,len(s),m):   #依次历遍每个数
               d[s[j]]=d.get(s[j],0)+1	#计数
          d=list(d.items())
          d.sort(key=lambda k:k[1])   #排序
          q1+=k-d[-1][1]    #加上    总数减去最大重复字符数
     print(q1)



————————————————
借鉴了他的
原文链接:https://blog.csdn.net/weixin_46640345/article/details/112426954

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值