题解 | #密码截取#

密码截取

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

全部评论

相关推荐

04-18 15:58
已编辑
门头沟学院 设计
kaoyu:这一看就不是计算机的,怎么还有个排斥洗碗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务