试题 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