这是原题链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
这道题可以利用动态规划的思想:
回文串就是一个字符串的和它的翻转之后的字符串相同的字符串。
首先我们构造如下的矩阵
P
(
i
,
j
)
P(i,j)
P(i,j)。
P
(
i
,
j
)
P(i,j)
P(i,j)的定义如下:
P
(
i
,
j
)
=
{
t
r
u
e
,
如
果
子
串
S
i
,
.
.
.
S
j
是
回
文
子
串
f
a
l
s
e
,
其
它
情
况
P(i,j) = \left\{\begin{matrix} true, & 如果子串S_{i},...S_{j}是回文子串\\ false, & 其它情况 \end{matrix}\right.
P(i,j)={true,false,如果子串Si,...Sj是回文子串其它情况
对于
P
(
i
,
j
)
P(i,j)
P(i,j)有如下的递归式:
P
(
i
,
j
)
=
P
(
i
+
1
,
j
−
1
)
a
n
d
S
i
=
=
S
j
P(i,j) = P(i+1,j-1) \ and\ S_{i} == S{j}
P(i,j)=P(i+1,j−1) and Si==Sj
基本示例为:
P
(
i
,
j
)
=
t
r
u
e
P
(
i
,
i
+
1
)
=
(
S
i
=
=
S
i
+
1
)
P(i,j) = true\\ P(i,i+1) = (S_{i} == S_{i+1})
P(i,j)=trueP(i,i+1)=(Si==Si+1)
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n = len(s)
p = [[False]*n for i in range(n)]
low,high = 0,0
for i in range(n):
for j in range(n-i):
p[j][j+i] = s[j] == s[j+i] and (i<2 or p[j+1][j+i-1])
if p[j][j+i]:
low,high = j,j+i+1
return s[low:high]