2.28每日一练解答

今天做了一下每日一练里的“简单题”:《小艺的英文名》

但是做了将近80分钟还是只有80%的数据过了

本人自己觉得没有什么问题,还请各位大佬能够帮忙看看是哪里出了问题

一起学习,一起进步!

k=int(input())
name=input()
#三个限制:回文,前k个字母每个至少出现一次,只有前k个字母
#先判断小艺的名字有奇数个还是偶数个字母
n=len(name)
letter='abcdefghijklmnopqrstuvwxyz'
letter=letter[0:k]
if n%2==0:#偶数情况
    #重要的问题是如何判断用掉了几种字母
    b=set()
    for i in range(0,int(n/2)):
        if name[i]!='?':
            b.add(name[i]) #巧妙利用集合的无重性,计算出用掉字母的个数
    x=0
    for i in b:
        x+=1 #x为用掉字母的个数
    for i in b:
        letter=letter.replace(i,'') #剩下的还没用的字母序列
    #再数问号的个数
    y=0
    for i in range(0,int(n/2)):
        if name[i]=='?':
            y+=1
    if y<k-x: #问号数量太少
        print('QAQ')
    if y>=k-x: #问号数量残余
        s=''
        p=y-k+x #可以用a填充的问号数(因为字典序)
        ins=0
        for i in range(0,int(n/2)):
            if name[i]!='?':
                s+='%s'%(name[i])
            elif name[i]=='?' and p>0:
                s+='a'
                p-=1
            elif name[i]=='?' and p==0:
                #填充a完毕以后开始顺次填充剩下的字母
                s+='%s'%(letter[ins])
                ins+=1
        s1=''.join(reversed(s))
        s=s+s1
        print(s)
        #偶数的情况解决了以后,奇数的情况也就明朗了
else:
    b=set()
    for i in range(0,int(n/2)+1):
        if name[i]!='?':
            b.add(name[i]) #巧妙利用集合的无重性,计算出用掉字母的个数
    x=0
    for i in b:
        x+=1 #x为用掉字母的个数
    for i in b:
        letter=letter.replace(i,'') #剩下的还没用的字母序列
    #再数问号的个数
    y=0
    for i in range(0,int(n/2)+1):
        if name[i]=='?':
            y+=1
    if y<k-x: #问号数量太少
        print('QAQ')
    if y>=k-x: #问号数量残余
        s=''
        p=y-k+x #可以用a填充的问号数(因为字典序)
        ins=0
        for i in range(0,int(n/2)+1):
            if name[i]!='?':
                s+='%s'%(name[i])
            elif name[i]=='?' and p>0:
                s+='a'
                p-=1
            elif name[i]=='?' and p==0:
                #填充a完毕以后开始顺次填充剩下的字母
                s+='%s'%(letter[ins])
                ins+=1
        s1=''.join(reversed(s))
        s2=s[0:len(s)-1] #对中间略微做一点处理
        s=s2+s1
        print(s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值