📅  最后修改于: 2023-12-03 15:28:48.859000             🧑  作者: Mango
门|门CS 2010年的问题19是一个关于编程算法的问题。题目要求编写一个程序,对于一个给定的字串,找出其中的最长回文子串,并输出该子串。
解决这个问题的一个常见办法是使用“中心扩展算法”,即从字符串的中心开始向两边扩展,寻找最长的回文子串。针对这个问题,可以设计如下的程序:
def longest_palindrome(s):
n = len(s)
start, end = 0, 0 # 最长子串的起始和终止下标
for i in range(n):
# 若长度为奇数,以s[i]为中心向两边扩展
l, r = i, i
while l >= 0 and r < n and s[l] == s[r]:
l -= 1
r += 1
if r - l - 1 > end - start:
start, end = l + 1, r - 1
# 若长度为偶数,以s[i]和s[i+1]为中心向两边扩展
l, r = i, i + 1
while l >= 0 and r < n and s[l] == s[r]:
l -= 1
r += 1
if r - l - 1 > end - start:
start, end = l + 1, r - 1
return s[start:end+1]
其中,start
和end
分别表示目前已得到的最长回文子串的起始和终止下标,初始值为0。使用两个嵌套的while循环,同时向左向右拓展,判断当前子串是否为回文子串。具体来说,在第一个while循环中,若l >= 0 and r < n and s[l] == s[r]
,则继续向两边扩展,更新l
和r
;否则,退出循环。在第二个while循环中,条件与之类似,只是更新的是l
和r
的初始值。最后,更新start
和end
,返回最长回文子串。
下面是一个示例测试的代码片段,可以直接运行:
s = 'abaxabaxabb'
print(longest_palindrome(s)) # 输出 'baxabaxab'