题目链接:点击打开链接
解:
从左向右遍历,根据回文串的特点向两边展开,取最短的回文串。
代码C++:
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
string shortestPalindrome(string s) {
int len = s.length();
int minLen = 2*len-1;
int site = 0;
for(int i=0; i<=len/2; i++){
int j=i,k=i;
int flag = 1;
int l = 0;
while(j>=0 && k<len){
if(s[j] != s[k]){
flag = 0;
break;
}
j--;
k++;
}
if(i >= len/2){l = (i+1)*2-1; }
else { l = (len-i)*2-1;}
if(flag && l<minLen ) {
minLen = l;
site = i;
}
j=i-1;
k=i;
flag = 1;
while(j>=0 && k<len){
if(s[j] != s[k]){
flag = 0;
break;
}
j--;
k++;
}
if(i > len/2){l = (i)*2;}
else {l = (len-i)*2;}
if(flag && l<minLen ) {
minLen = l;
site = i;
}
}
string str = "";
if(minLen % 2 == 0){
if(site <= len/2){
int tl = len-site;
str = s.substr(site,len);
for(int i=0; i<tl/2; i++){
int tmp = str[i];
str[i] = str[tl-i-1];
str[tl-i-1] = tmp;
}
str += s.substr(site,len);
}else{
int tl = site;
str = s.substr(0,site);
for(int i=0; i<tl/2; i++){
int tmp = str[i];
str[i] = str[tl-i-1];
str[tl-i-1] = tmp;
}
str = s.substr(0,site)+str;
}
}else{
if(site+1 <= len/2){
int tl = len-site-1;
str = s.substr(site+1,len);
for(int i=0; i<tl/2; i++){
int tmp = str[i];
str[i] = str[tl-i-1];
str[tl-i-1] = tmp;
}
str += s.substr(site,len);
}else{
int tl = site;
str = s.substr(0,site);
for(int i=0; i<tl/2; i++){
int tmp = str[i];
str[i] = str[tl-i-1];
str[tl-i-1] = tmp;
}
str = s.substr(0,site+1)+str;
}
}
//cout << site << " " << minLen <<endl;
return str;
}
int main()
{
//cout << shortestPalindrome("abb") << endl;
return 0;
}