重复字符串【第十一届】【决赛】【研究生组】

代码在最后,本文思路:

#如果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)

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值