问题描述
(找到字符串中最长的回文子串)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:Input: “babad”
Output: “bab”
Note: “aba” is also a valid answer.
DP动态规划解法
问题分析:
基于动态规划的两个特性:1.无后效性 2.最优子结构 (参考: 什么是动态算法?)
为了在暴力解决的基础上减下一些不必要的可能的计算, 本问题可以转化为DP问题
假设给定字符串为"abcba",若我们得出, "bcb"是回文,那么当此字符串的左右两个字符相等的时候,我们就可以判断"abcba"也是回文.
代码如下:
class Solution:
def longestPalindrome(self, s: str) -> str:
record = [[0 for i in range(len(s))] for j in range(len(s))]
length=start= 0
for i in range(len(s)):
for j in range(i+1):
if i - j < 2 and s[i]==s[j]:
record[i][j]=1
elif s[i]==s[j] and record[i-1][j+1]:
record[i][j]=1
if i - j + 1 > length and record[i][j]:
length = i-j+1
start = j
s=s[start:length+start]
return s
我的解法
因为是即兴发挥,所以我采用了一个从最大字符串开始找的方法,假设最大的回文串长度n为len(string),然后进行验证. 如果不是,则减小n,继续在字符串中找.
class Solution:
def longestPalindrome(self, s: str) -> str:
if len(s) < 2:
return s
maxl = length = len(s)
while maxl:
n = length - maxl + 1
while n:
substr = s[n - 1:n + maxl - 1]
if substr == substr[::-1]:
return substr
n = n - 1
maxl = maxl - 1
return ""