采用动态规划的方法。
使用二维数组dp[i,j]表示字符串从i到j为回文串,则状态转移方程为:
d
p
[
i
,
j
]
=
{
1
,
i
f
d
p
[
i
+
1
,
j
−
1
]
=
=
1
a
n
d
s
[
i
]
=
=
s
[
j
]
0
,
o
t
h
e
r
s
dp[i,j] = \begin{cases} 1, if dp[i+1,j-1] == 1 and s[i] == s[j]\\ 0, others \end{cases}
dp[i,j]={1,ifdp[i+1,j−1]==1ands[i]==s[j]0,others
初始状态为
d
p
[
i
,
i
]
=
1
dp[i,i] =1
dp[i,i]=1
d
p
[
i
,
i
+
1
]
=
1
,
i
f
s
[
i
]
=
=
s
[
i
+
1
]
dp[i,i+1] = 1 , if s[i]==s[i+1]
dp[i,i+1]=1,ifs[i]==s[i+1]
class Solution {
public:
string longestPalindrome(string s) {
int N = s.length();
if(N <= 1)
return s;
vector<vector<int>> dp(N,vector<int>(N));
int left = 0, last = 1;
for(int i=0; i<N; ++i)
{
dp[i][i] = 1;
if(i < N-1)
{
if(s[i] == s[i+1])
{
dp[i][i+1] = 1;
left = i;
last = 2;
}
}
}
for(int len=3; len<=N; ++len)
{
for(int i = 0; i+len-1 < N; ++i)
{
int j = i+len-1;
if(dp[i+1][j-1] == 1 && s[i] == s[j])
{
dp[i][j] = 1;
left = i;
last = len;
}
}
}
cout<< left << endl<<last;
return s.substr(left, last);
}
};