某比赛小记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)) #打印结果

  

 

posted @ 2018-11-16 22:06  国土无双  阅读(124)  评论(0)    收藏  举报