题解 | #密码截取#
密码截取
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