LeetCode 5.最长回文子串
题目描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
动态规划求解法
动态规划法的思路是将问题分解成一个一个的小问题,然后进行求解来得到原问题的解,所以在示例字符串 “abba” 中,我们知道 “bb”这个子串是回文子串,那么我们只需要判断这个字串两边的一个字符就能判断一个更大的子串是否为回文子串。
基于上面的思路我们可以设计动态规划算法进行求解了
首先初始化一个n*n表来储存子问题的求解:在该表中满足若s[i : j]为回文子串,则 P(i , j) =1,否则为0
那么我们在该表中,对角线元素都为1,因为单个字符串肯定是回文。然后循环一遍,找到所有的二字母的回文。
后面我们根据表中已解决的问题求解整个字符串
以此类推,便可以得到整个表的结果
代码如下
import numpy as np
def longestPalindrome(s):
Len = len(s)
P = np.eye(Len) #生成单位矩阵,对角线元素为1
ps =s[0]
Longest = 1
for i in range(Len-1):
"""
初始化所有的二字母回文子串
"""
if s[i]==s[i+1]:
P[i,i+1] = 1
for i in range(Len-1,-1,-1):
for j in range(i,Len-1):
#根据单字母和二字母子串的回文来逐步求解整个字符串
if i > 0 and s[j+1] == s[i-1] and P[i,j]:
P[i-1,j+1] = 1
print(P)
欢迎关注公众号 : 数学算法实验室