最长回文子串
给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串。
样例
给出字符串 "abcdzdcab"
,它的最长回文子串为 "cdzdc"
。
分析:首先了解一下回文子串就是正着反着都一样的字符串,例如waw,woow,woooow等。解这道题的思路就是用一个二维数组记录这两个数组下标内的字符串是不是回文子串,所以这是动态规划的思想。定义两个变量i,j。i用来表示字符串最右端下标,j用来表示字符串最左端下标。i==j时,就是一个字符肯定是回文子串;i-j==1时,是相邻的两个子串,相等也是回文子串;i-j>=2时,就是中间最少隔一个字符的子串了,这时就可以判断左右两端字符是否相等再判断中间隔得字符是不是回文子串。下面是代码
class Solution {
public:
/*
* @param s: input string
* @return: the longest palindromic substring
*/
string longestPalindrome(string &s) {
// write your code here
int dp[s.size()][s.size()]={0},left=0,right=0,len=0;
for(int i=0;i<s.size();i++)//i从下标0开始
{
for(int j=0;j<=i;j++)//j最大可以等于j,相当于单个字母
{
dp[j][i]=(s[j]==s[i])&&((i-j<2)||(dp[j+1][i-1]));//动态规划,这里下标可能会小于0,可能有隐患
if(dp[j][i]&&(i-j+1>len))//这里和目前最大长度比较
{
len=i-j+1;
left=j;
right=i;
}
}
}
return s.substr(left,len);
}
};