蓝桥杯备战 Day 12 2022.3.11

昨天装了一天的linux和Qt,鸽了,今天复工。

试题 历届真题 重复字符串【第十一届】【决赛】【A组】

我的思路就是,把这个字符串等分k份,依次以每一小子串为基准,统计剩余子串变为当前子串需要改变的字母个数。代码如下,只能通过40%。

import sys
k = int(input()) # 重复k
s = input() # 字符串

lens = len(s) # 字符串长度

# 能否被k整除,不能就返回-1
if lens%k == 0:
    pass
else:
    print(-1)
    sys.exit()

s = list(s)

# 字串长度
lens2 = int(lens/k)

mint = 1000000

for i in range(k):
    tmp = s[i*lens2:i*lens2 + lens2] # 以第一段为子串
   
    count = 0
    for j in range(k):
        now = s[j*lens2:j*lens2 + lens2]
        for x in range(lens2):
            if now[x] != tmp[x]:
                count = count+1
                

    mint = min(count,mint)
    


print(mint)
    

这种情况考虑的太简单,如果对每个子串进行统计,选出每一位上出现频率最高的字母,这些字母组成的子串可能最简。思路就是建立一个字典,按下图所示,对每个子串对应位置字母进行统计

最后,选每一组出现频率最高的字母组合在一起,形成目标子串。

接下来,每一个子串都按照这个目标子串改变自身的字母,统计改变个数就可以实现要求。

改进代码如下,正确率达到100%,美滋滋

import sys
k = int(input()) # 重复k
s = input() # 字符串

lens = len(s) # 字符串长度

s = list(s)

# 字串长度
lens2 = int(lens/k)

target = ''
for j in range(lens2):
 
    dic = {}
    for i in range(k):
        if s[j+i*lens2] in dic:
            dic[s[j+i*lens2]] += 1
        else:
            tmpdic = {s[j+i*lens2]:1}
            dic.update(tmpdic)
            
    tmplist = sorted(dic.items(), key=lambda item:item[1], reverse=True)
    target += tmplist[0][0]

target = list(target)
count = 0
for i in range(k):
    tmp = s[i*lens2:i*lens2+lens2]
    for j in range(lens2):
        if target[j] == tmp[j]:
            pass
        else:
            count = count + 1

print(count)
    
    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值