返回
剑指 Offer II 027:回文子串
闲谈
2023-11-14 03:37:40
算法
对于长度为 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)。我们还提供了一些代码示例来帮助您更好地理解该算法。希望本文对您有所帮助。