题解 | #密码截取#

密码截取

https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1?tpId=37&tqId=21255&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D37%26type%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=

import sys


s = input()
'''
用s接收字符串
'''



def Definedictory(s):
    '''
    定义字符的字典,键为字符,值为字符在s中的索引
    '''
    dict1={}
    Noduplicates= list(set(s))
    for x in Noduplicates:
        i=0
        dict1[x]=[]
        while i < len(s):
            if x==s[i]:
                dict1[x].append(i)
            i+=1
    return dict1
            

def findmaxsymmtrylengh(s):
    '''
    找到最大的长度的对称字串,并返回,
    整体思路是从索引为0,用单词index标记,开始找和索引为0相同的字符,用end标记,标记为symmtryindex
    并遍历完整个字符串,找到最大的symmtryindex
    如果没有找到,index+1,如果找到了,index不变,current+1,比较current+1的值和字符串的end-1
    如果current+1等于end-1,更新current,如果不等于,更新index

    思路更新:
    前提条件1:
    
    先将字符串去重,
    去重后建立一个以每个字符串为键的字典
    然后在去重前的字符串中找每个字符的位置,如果有多个,
    就都记录下来,升序排列,放入列表
    然后将字符和对应的列表添加到字典中
    
    前提条件2:
    确定一个对称串的方法,是从第一个字符和最后一个字符,做比较如果相等,比较
    第二个和倒数第二个,直到剩一个字符没办法比较,或者全部都比较了,全部都相等



    正式比较的算法,前面的准备工作做好以后,从字符串的首字符开始,找到列表中该字符最大的索引,将该索引对应的字符
    与首字符比较,按照前提条件2的算法进
    行判断;如果中间不相等,那么停止比较,将首字符与列表中的倒数第二个索引开始新的比较,
    如果列表中的索引有能满足条件的,
    将它对应的字符串添加到L中,最后比较长度用.没有满足条件的,将比较的首字符向前挪动一位


    思路三:比较的话,可以将其做成函数的形式,只需要传入待比较的
    字符串,进行判断就行,可以简化代码


    '''
    dict1=Definedictory(s)

    L=[]
    i=0

    while i < len(s):
        start=i
        n=-1
        while abs(n)<len(dict1[s[i]]):
            end = dict1[s[i]][n]
            j  = end
            k  = i
            while s[k] == s[j]:
                k+=1
                j-=1
				#k是左边的,j是右边的指针,如果k==j说明类似ABCBA这种对称类型找到了,如果k>j说明类似ABBAzhezhong对称类型找到了,这时说明整个字符串都遍历完了停止遍历
				#还要将k,j的值还原一步方便为后面退出while循环的原因作判断
                if k==j or k > j:
                    L.append([start,end+1])
                    k-=1
                    j+=1
                    break
				#while循环退出有可能是正常比较完break退出,也有可能是中间比较的过程中字符不相等退出
				#如果是原因2那么需要进行下一ge n的比较,如果不是那么因为是倒着从列表中取的字符,这个就是最大的字符串了
            if s[k]!=s[j]:
                n-=1
            else:
                break
			#为了避免重复比较,需要在比较完一次后删除一个列表的首个索引,不进行维护
        del dict1[s[i]][0]
		#比较第二个字符,循环比较
        i+=1
    maxlength=0
    for x in L:
        i=int(x[0])
        j=int(x[1])
        length=j-i
        maxlength=max(maxlength,length)
    
    print(maxlength)

        

findmaxsymmtrylengh(s)        



                























def compare():
    pass

全部评论

相关推荐

2025-12-01 10:57
已编辑
云智研发公司_后台开发
先说明一下&nbsp;bg双非本,没有特别加分的竞赛奖项,只有一些省奖作为25入职的校招生我想我我入职体验是最新鲜的面试准备,工作体验(本人是研发岗)1、首先作为一个实习经历并不多的双非本来说,我能过筛选已经很出乎意外了,所以我格外重视这次面试①首先就是算法题,我在力扣刷了两遍的hot100,最起码我认为我不能在算法题上失误②其次我在牛客网和小红书上看了很多的面经,包括一些自我介绍,一些面试技巧等tips:①简历中的内容一定要理解透彻,面试官可能问到简历中的各种内容②如果在面试中遇到不会的问题,可以直接说明,面试官可以理解校招同学我只能说足够的准备才能不浪费一次面试的机会2、入职以后,我最大的体验就是同事之间的互相帮助,大家不会一个简单的问题就不耐烦,反而会问你有没有理解,可以重复的帮助你①入职后,工作上不理解的一定要积极的询问同事或者导师或者leader,大家对于校招同学有些很高的包容性,面对其他问题可以问hr②新入职都可能存在彷徨,有压力,毕竟入职一定是需要学习新的知识,但是可以化压力为动力,努力学习3、最后我想说的,云智大家庭是一个包容性很强很温暖的大家庭,没有学历歧视,没有经验歧视,没有地域歧视,没有职位歧视,只有一起共同进步的目标,欢迎大家向云智投出简历(我本人在武汉腾讯云智,有想咨询的问题可以私聊我)ps:图一是入职培训优秀小组
面了100年面试不知...:是谁有鹅仔
腾讯云智研发成长空间 5107人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务