某比赛小记4- 最长回文子串
题目,给定一个长字符串,求最长回文子串。(题目字符串下载)
题解:首先要区分回文子串 和 回文子序列的区别。本题是求最长回文子串。其次需要考虑给所求得的回文子串总长度是奇数还是偶数,如果是奇数则是aba形式,如果是偶数则是abba形式。最后就是求解,这个算法题太普遍了,只需要给字符串增加一个辅助字符#,即可全部当做奇数字符串来处理了。
python版本:
str = "给定字符串,见下载文件"
str2 = [] #存储辅助字符数组,辅助字符串用井号间隔
for s in str:
str2.append(s)
str2.append('#')
str2.pop(-1)
str3 = "".join(str2) #str3辅助字符串
def findmax(s,i): #在辅助字符串中寻找最长回文子串的半径
# print(s)
c = 0
tag = 1
while i - c >= 0 and i + c <len(s):
# print(s[i-c]+":"+s[i+c])
if s[i-c] != s[i+c]:
return c - 1
else:
c += 1
return c
def getret(s,i,maxc):#根据下标、半径,打印最终结果
print(s[i])
ret = s[i-maxc:i+maxc]
print(ret)
return ret.replace('#','')
ret = [] #记录每个下标作为中间点所对应的回文串的长度的半径
for i in range(len(str3)):
ret.append(findmax(str3,i))
retindex = -1 #最终结果的下标
retmax = -1 #最终结果的值
for j in range(len(ret)):
if ret[j] > retmax:
retindex,retmax = j,ret[j]
print(getret(str3,retindex,retmax)) #打印结果

浙公网安备 33010602011771号