描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
数据范围:字符串长度满足 1≤𝑛≤2500 1≤n≤2500
输入描述:
输入一个字符串(字符串的长度不超过2500)
输出描述:
返回有效密码串的最大长度
示例1
输入:
ABBA
输出:
4
示例2
输入:
ABBBA
输出:
5
示例3
输入:
12HHHHA
输出:
4
本题可以通过先找到中间的对称轴元素,再向两边扩展,从而找到最长对称子串,这种方法的时间复杂度比两层遍历要低,运行更快。在找对称轴元素时,需要注意两种情况:一是对称子串有偶数个元素,这种情况没有一个实体的对称元素,需要通过当前元素和下一元素比较是否相等得到;而是对称子串有奇数个元素,这种情况只需要得到对称轴元素再向两边延伸即可。这两种判断可以都判断一遍,为了避免出现像AHHHA这样的情况,没必要设置elif,两个if即可。
string=input()
def getlongestsubstr(str):
maxlen=0
for i in range(1,len(str)-2):
midindex=i
if str[midindex]==str[midindex+1]:
left=midindex
right=midindex+1
thislen=0
while right<=len(str)-1 and str[left]==str[right]:
thislen+=2
left-=1
right+=1
if thislen>maxlen:
maxlen=thislen
if str[midindex-1]==str[midindex+1]:
left=midindex-1
right=midindex+1
thislen=1
while right<=len(str)-1 and str[left]==str[right]:
thislen+=2
left-=1
right+=1
if thislen>maxlen:
maxlen=thislen
return maxlen
print(getlongestsubstr(string))