📌  相关文章
📜  国际空间研究组织 | ISRO CS 2008 |问题 12(1)

📅  最后修改于: 2023-12-03 14:50:46.060000             🧑  作者: Mango

国际空间研究组织 (ISRO)

ISRO CS 2008
问题 12

题目描述

你需要编写一个程序,找到给定字符串中的最长回文子串。回文是正反都相同的字符串序列。

输入格式

  • 单个字符串,长度不超过 1000 个字符。

输出格式

  • 最长回文子串。
代码示例
def longest_palindrome(s):
    # 在此处添加你的代码

# 测试输入
input_str = "babad"

# 调用函数并打印结果
print(longest_palindrome(input_str))
解法

要解决这个问题,可以使用动态规划的方法。

首先,定义一个二维数组 dp,dp[i][j] 表示字符串 s 中从索引 i 到 j 的子串是否是回文字符串。

然后,通过填充数组 dp 来找到最长的回文子串。具体算法如下:

  1. 初始化 dp[i][i] = True,单个字符肯定是回文字符串。
  2. 当 s[i] = s[i+1] 时,dp[i][i+1] = True,这是因为相同的两个字符也是回文字符串。
  3. 对于长度超过 2 的子串,如果首尾字符相同且去掉首尾后的子串是回文字符串(即 dp[i+1][j-1] = True),那么 dp[i][j] = True。
  4. 在填充 dp 数组的过程中,记录最长回文子串的起始索引 start 和长度 max_length。

最后,通过切片操作返回最长回文子串。

代码实现
def longest_palindrome(s):
    n = len(s)
    if n < 2:
        return s
    
    dp = [[False] * n for _ in range(n)]
    
    max_length = 1
    start = 0
    
    for i in range(n):
        dp[i][i] = True
    
    for j in range(1, n):
        for i in range(j):
            if s[i] == s[j] and (j - i <= 2 or dp[i+1][j-1]):
                dp[i][j] = True
                if j - i + 1 > max_length:
                    max_length = j - i + 1
                    start = i
    
    return s[start:start+max_length]

# 测试输入
input_str = "babad"

# 调用函数并打印结果
print(longest_palindrome(input_str))  # 输出:bab 或 aba

注:上述代码使用了动态规划的方法,时间复杂度为 O(n^2),空间复杂度为 O(n^2)。