思路1:
1 从每一个回文对称点开始向左右遍历,直到左右字符不相等。求出最长子串。
2 考虑回文子串可能是奇数长度,对称点只有一个。也可能是偶数长度。对称点有俩个
代码:
string longestPalindrome(string s) {
int len=s.length();
string result="";
if(len==0)
return result;
for(int i=0;i<len;i++){ //对称点是奇数点
int left=i;
int right=i;
while(left>0&&right<len-1&&s[left-1]==s[right+1]){
left--;
right++;
}
if(right-left+1>result.length()){
result=s.substr(left,right-left+1);
}
}
for(int i=0;i<len;i++){ //对称点是偶数点
if(s[i]==s[i+1]){ //俩个对称点
int left=i;
int right=i+1;
while(left>0&&right<len-1&&s[left-1]==s[right+1]){
left--;
right++;
}
if(right-left+1>result.length()){
result=s.substr(left,right-left+1);
}
}
}
return result;
}
思路2:
动态规划
string longestPalindrome(string s) {
int len=s.length();
string result="";
if(len==0)
return result;
int maxLen=0;
int start=0;
int end=0;
vector<vector<bool>> dp(len,vector<bool>(len,false));
for(int j=0;j<len;j++){
for(int i=0;i<j;i++){
if(s[i]==s[j]&&(j-i<=2||dp[i+1][j-1])){
dp[i][j]=true;
if(j-i+1>maxLen){
maxLen=j-i+1;
start=i;
end=j;
}
}
}
}
return s.substr(start,end-start+1);
}
思路3
遍历字符串,每次先查找相同的字符数量,然后下一个起始位置就是不相同的字符。
string longestPalindrome(string s) {
int len=s.length();
if(len==0)
return "";
int maxLen=1;
int start=0;
int left=0;
int right=0;
for(int i=0;i<len&&len-i>maxLen/2;){
left=i;
right=i;
while(right<len-1&&s[right+1]==s[right]) //重复字符
right++;
i=right+1; //下一次字符的起始位置
while(right<len-1&&left>0&&s[left-1]==s[right+1]){
right++;
left--;
}
if(maxLen<right-left+1){
maxLen=right-left+1;
start=left;
}
}
return s.substr(start,maxLen);
}