📜  门|门CS 2010 |问题 19(1)

📅  最后修改于: 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]

其中,startend分别表示目前已得到的最长回文子串的起始和终止下标,初始值为0。使用两个嵌套的while循环,同时向左向右拓展,判断当前子串是否为回文子串。具体来说,在第一个while循环中,若l >= 0 and r < n and s[l] == s[r],则继续向两边扩展,更新lr;否则,退出循环。在第二个while循环中,条件与之类似,只是更新的是lr的初始值。最后,更新startend,返回最长回文子串。

示例测试

下面是一个示例测试的代码片段,可以直接运行:

s = 'abaxabaxabb'
print(longest_palindrome(s)) # 输出 'baxabaxab'

参考资料