
思路一:从第一个开始进行扩展
扩展有两种扩展方式:1.以一个字符为中心进行扩展 2.以两个字符为中心进行扩展

代码如下:
class Solution {
public:
int loc,maxlen; //用于记录起始位置以及回文串的最长长度
string longestPalindrome1(string s) {
int length=s.length();
if(length<2) return s;
for(int i=0;i<length-1;i++){
extend(s,i,i); //以一个点作为中点扩展
extend(s,i,i+1); //以两个点作为中点扩展
}
return s.substr(loc,maxlen);
}
//向两边扩展
void extend(string s,int j, int k){
while(j>=0&&k<s.length()&&s[j]==s[k]){
j--;k++;
}
//如果求得的回文串长度大于之前最大长度,更新回文串第一个位置下标以及最大长度
if(maxlen<k-j-1){
loc=j+1;
maxlen=k-j-1;
}
}
};思路二:动态规划的思路,用二维数组来标记最长的回文串的前端与 后端,具体思路见图

代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int length=s.length();
string res="";
if(length<2) return s;
bool dp[length][length] ;
memset(dp,false,length*length);
for(int i=length-1;i>=0;i--){
for(int j=i;j<length;j++){
dp[i][j]=((s[i]==s[j])&&(j-i<2||dp[i+1][j-1]));
if(dp[i][j]&&j-i+1>res.length()){
res=s.substr(i,j-i+1);
}
}
}
return res;
}
};
版权声明:本文为qq_27524749原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。