Use DP. dp[i][j] means whether the substring i to j is a palindrome.
class Solution {
public:
string longestPalindrome(string s) {
int len=s.length();
bool dp[len][len];
int start=0,end=0;
for(int j=1;j<len;j++)
for(int i=j;i>=0;i--)
{
if(s[i]!=s[j])
dp[i][j]=0;
else
dp[i][j]=j-i<=1?1:dp[i+1][j-1];
if(dp[i][j]&&j-i>end-start)
{
start=i;
end=j;
}
}
return s.substr(start,end-start+1);
}
};
The following is a much faster method (4ms) which I learned from the discussion board. For every i in the string, first find out longest string with characters are all s[i], then expand from this string to get the longest palindrome.
class Solution {
public:
string longestPalindrome(string s) {
int len=s.length();
int L=0,R=0;
for(int i=0;i<len&&len-i>(R-L)/2;)
{
int j=i;
while(j<len&&s[j+1]==s[j])
j++;
int templ=i,tempr=j;
while(templ>0&&tempr<len-1&&s[templ-1]==s[tempr+1])
{
templ--;
tempr++;
}
if(tempr-templ>R-L)
{
L=templ;
R=tempr;
}
i=j+1;
}
return s.substr(L,R-L+1);
}
};