题目描述
Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?
输入描述:
输入一个字符串
输出描述:
返回有效密码串的最大长度
示例1
输入
ABBA
输出
4
思路1:
以每个字符(奇数长度的回文串)或者字符间空隙(偶数长度的回文串)分别向左右扩充,记录遇到的最大长度
先考虑奇数个数的回文串,再考虑偶数个数的回文串。
while True:
try:
s=input()
if s==s[::-1]:
maxlength=len(s)
else:
maxlength=0
for i in range(len(s)):#寻找以i-1,i为中点的偶数字符串长度
low=i-1
high=i
while (low>=0 and high<len(s) and s[low]==s[high]):
low-=1
high+=1
if high-low-1>maxlength:
maxlength=high-low-1
low=i-1#寻找以i为中点的奇数字符串长度
high=i+1
while(low>0 and high<len(s) and s[low]==s[high]):
low-=1
high+=1
if high-low-1>maxlength:
maxlength=high-low-1
print(maxlength)
except:
break
思路2:
理论支持:每当增加一个新的字母,最大回文串的长度只能增加1或者2,不可能增加更多,并且,新的最大回文串必然要包含这个字母!
所以,从头到尾扫描字符串,每增加一个新的字符,判断以这个字符结尾,且长度为maxLen+1或者maxLen+2的子串是否为回文,如果是,更新最大回文子串。代码如下:
def longeststring(string):
if string[::-1]==string:
return len(string)
maxlength=0
for i in range(len(string)):
if i-maxlength>=1 and string[i-maxlength-1:i+1]==string[i-maxlength-1:i+1][::-1]:
maxlength+=2
continue
if i-maxlength>=0 and string[i-maxlength:i+1]==string[i-maxlength:i+1][::-1]:
maxlength+=1
return maxlength
while True:
try:
string=input()
if string:
print(longeststring(string))
except:
break