题目链接https://leetcode-cn.com/problems/longest-palindromic-substring/
解法:动态规划。
一:确定状态
根据问题寻找 s 中最长的回文子串。我们假设字符串x为回文串,那么我们在x前后各增加同一个字符,得到的新串肯定为一个回文串。
由此可知
(1)最后一步为:在x前后各增加同一个字符,得到最长的回文子串。
(2)子问题:用长为L得回文串str,在其前后各增加同一个字符,得到长为L+2得新回文串
二:确定转移方程
我们用P(i,j) 表示字符串 s 的第 i 到 j个字母组成的串(下文表示成 s[i:j]s[i:j])是否为回文串
P(i,j)=P(i+1,j-1)&&(s[i]==s[j])
如果P(i,j)为true且长度大于已发现得长度,就更新最长的回文子串。(附:j-i+1=L)
三:边界初始化
当j-i<3时,d[i][j]=true。(例如"aba",“aa”,“a”)
string longestPalindrome(string s){
int len = s.size();
vector< vector<int> > dp(len, vector<int>(len));
int start = 0, maxL = 1;
for (int L = 1; L <=len; L++)
{
for (int i = 0; i < len; i++)
{
int j = i + L - 1;
if (j>=len)
{
break;
}
if (s[i]!=s[j])
{
dp[i][j] = false;
}
else
{
if (j-i<3)
{
dp[i][j] = true;
}
else
{
dp[i][j] = dp[i+1][j-1];
}
}
if (dp[i][j]&&L>maxL)
{
start = i;
maxL = L;
}
}
}
return s.substr(start, maxL);
}