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