题目描述:给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
1.中心法:i作为回文串的中心字母,j作为回文串的半径进行遍历;![](https://i-blog.csdnimg.cn/blog_migrate/f5c512439def8604de78ce210edd227d.png)
class Solution {
public:
string longestPalindrome(string s) {
if(s.empty()) return s;
int len = s.size()+1;
int max = 0;
int index = 0; //中心点
int num = 0;
string A;
for(int i = 0;i < len;++i)
{
for(int j = 0;(i-j)>=0 && (i+j)<len;++j) //奇
{
if(s[i-j] != s[i+j])
{
break; //换下一个字母作为中心
}
num = 2*j+1;
if(num > max)
{
max = num;
index = i;
}
}
for(int k = 0;(i-k)>=0 && (i+k+1)<len;++k) //偶
{
if(s[i-k] != s[i+k+1])
{
break;
}
num = 2*k+2;
if(num > max)
{
max = num;
index = i;
}
}
}
if(max == 1) A = s;
if(max%2 != 0) A = s.substr(index-max/2,max); //奇
if(max%2 == 0) A = s.substr(index-max/2+1,max); //偶
return A;
}
};
2.动态规划
class Solution {
public:
string longestPalindrome(string& s) //动态规划
{
if(s.size() == NULL)
{
return s;
}
const int n = s.size();
int index = 0; //中心点
int max = 0;
bool dp[n][n];
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;++i)
{
for(int j = 0;j <= i;++j)
{
if((i-j) < 2)
{
dp[i][j] = (s[i] == s[j]);
}
else
{
dp[i][j] = (s[i] == s[j] && dp[i-1][j+1]);
}
if(dp[i][j] && max < i-j+1)
{
max = i-j+1;
index = j;
}
}
}
return s.substr(index,max);
}
int main()
{
string s;
cout << "Input source string: ";
cin >> s;
cout << "The longest palindrome: " << longestPalindrome(s);
return 0;
}
};
(∩•̀ω•́)⊃-*⋆代码参考:https://www.jianshu.com/p/c82cada7e5b0