代码在最后,本文思路:
#如果k,lenth小于1不可能成为k次,lenth%k即如果s不是k的整数倍,也不可能成为k次字符串
#如果s是k的整数倍,则再考虑以下情况
#建立一个标志数组初始为0,统计每个字串包含的字符种类,以及各个种类的数量,
#如有abc bba adc 则在第一轮中f['a'] = 2,f['b'] = 1,第二轮中f['b'] = 2,f['d'] = 1,第三轮
#把字符串分成k个长为lenth/k的串,并保存每个串的起始下标,如样例分成2个长为3的串
#开始从每个子串的首字符开始比较
每一轮都要初始标志数组
#如有abc bba adc 则在第一轮中f['a'] = 2,f['b'] = 1,第二轮中f['b'] = 2,f['d'] = 1,第三轮中f['c'] = 2,f['a'] = 1
#服从一轮中字符一样最多的字符用到flag.index(max(flag),详情参考:(373条消息) python寻找列表最大值最小值及其下标_sueong的博客-CSDN博客_python中求列表的最大最小值
count = 0;#计数本轮需要变更的次数
summ += count#总次数为每一轮的次数相加
#输出总的次数
#输入
k = int(input())
s = input()
lenth = len(s)#字符串的长度
summ = 0#统计总共需要修改的次数
#如果k,lenth小于1不可能成为k次,lenth%k即如果s不是k的整数倍,也不可能成为k次字符串
if k < 1 or lenth < 1 or lenth % k != 0:
summ = -1
elif lenth % k == 0:#如果s是k的整数倍,则再考虑以下情况
#建立一个标志数组初始为0,统计每个字串包含的字符种类,以及各个种类的数量,
#如有abc bba adc 则在第一轮中f['a'] = 2,f['b'] = 1,第二轮中f['b'] = 2,f['d'] = 1,第三轮中f['c'] = 2,f['a'] = 1
flag = []
for i in range(ord('z')+1):
flag.append(0)
#把字符串分成k个长为lenth/k的串,并保存每个串的起始下标,如样例分成2个长为3的串
c = lenth/k
begin = []
for i in range(k):
begin.append(int(i*c))#保存每个串的起始下标
#开始从每个子串的首字符开始比较
p = 1#轮数,从1开始
while p <= c:#不能超过各子串的最大长度
#Initial list is 0,即每一轮都要初始标志数组
for i in range(ord('a'),ord('z')+1):
flag[i] = 0
for x in begin:
x = int(x +p-1)
flag[ord(s[x])] += 1
#服从一轮中字符一样最多的字符
cc = chr(flag.index(max(flag)))#change char需要变更为该字符
#print(cc)
count = 0;#计数本轮需要变更的次数
for j in begin:
j = int(j+p-1)
#print(s[j])
if s[j] != cc:
count += 1
summ += count#总次数为每一轮的次数相加
p += 1
else:
pass
#输出总的次数
print(summ)