机试刷题_NC17 最长回文子串【python】
NC17 最长回文子串
动态规划思路
1.定义状态:
设 dp[i][j] 表示字符串 A 从第 i 个字符到第 j 个字符是否为回文子串。
如果是回文子串,dp[i][j] = True,否则为 False。
2.状态转移方程:
如果 A[i] == A[j],并且 dp[i+1][j-1] 为 True,那么 dp[i][j] = True。
即:dp[i][j] = (A[i] == A[j]) and dp[i+1][j-1]。
3.边界条件:
单个字符一定是回文子串,即 dp[i][i] = True。
两个字符时,如果 A[i] == A[j],则 dp[i][j] = True。
4.初始化:
初始化所有长度为 1 的子串为回文子串。
初始化所有长度为 2 的子串是否为回文子串。
5.填充 DP 表:
从长度为 3 开始,逐步填充 DP 表,直到长度为 n。
6.结果:
在填充 DP 表的过程中,记录最长的回文子串长度。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param A string字符串
# @return int整型
class Solution:
def getLongestPalindrome(self , A: str) -> int:
# 动态规划
n = len(A)
if n<=1:
return n
dp = [[False]*n for i in range(n)]
max_len = 1
# 单个字符一定是回文子串
for i in range(n):
dp[i][i] = True
# 检查长度为2的子串
for i in range(n-1):
if A[i]==A[i+1]:
dp[i][i+1] = True
max_len = 2
# 检查长度大于2的子串
for length in range(3,n+1): #子串长度从3到n
for i in range(n-length+1): #子串起始位置
j = i+length-1 #子串结束位置
if A[i]==A[j] and dp[i+1][j-1]:
dp[i][j] = True
max_len = max(max_len,length)
return max_len