返回

剑指 Offer II 027:回文子串

闲谈

算法

对于长度为 n 的字符串,我们定义一个布尔型二维数组 dp,其中 dp[i][j] 表示字符串中从位置 i 到位置 j 的子字符串是否为回文子串。我们从左上到右下对 dp 数组进行填表,其中 dp[i][i] 显然是回文子串,dp[i][i+1] 当且仅当字符串中第 i 个字符与第 i+1 个字符相同。对于长度大于 2 的子字符串,我们使用如下的递推关系来更新 dp 数组:

dp[i][j] = (dp[i+1][j-1] && str[i] == str[j])

其中,str 为给定的字符串。这个递推关系的含义是:如果字符串中从位置 i+1 到位置 j-1 的子字符串是回文子串,并且字符串中第 i 个字符与第 j 个字符相同,那么字符串中从位置 i 到位置 j 的子字符串也是回文子串。

代码示例

def longest_palindrome(string):
  """
  计算字符串中最长回文子串的长度。

  参数:
    string: 给定的字符串。

  返回:
    最长回文子串的长度。
  """

  # 初始化 dp 数组。
  n = len(string)
  dp = [[False] * n for _ in range(n)]

  # 填表。
  for i in range(n-1, -1, -1):
    dp[i][i] = True
    for j in range(i+1, n):
      if string[i] == string[j]:
        if j - i == 1:
          dp[i][j] = True
        else:
          dp[i][j] = dp[i+1][j-1]

  # 计算最长回文子串的长度。
  max_length = 0
  for i in range(n):
    for j in range(n):
      if dp[i][j]:
        max_length = max(max_length, j - i + 1)

  return max_length

复杂度分析

算法的时间复杂度为 O(n^2),其中 n 为字符串的长度。这是因为我们对 dp 数组进行了 n^2 次填表操作。算法的空间复杂度也是 O(n^2),这是因为我们使用了 n^2 的空间来存储 dp 数组。

参考资料

总结

在本文中,我们介绍了回文子串的动态规划算法。该算法的时间复杂度为 O(n^2),空间复杂度也是 O(n^2)。我们还提供了一些代码示例来帮助您更好地理解该算法。希望本文对您有所帮助。