题目:给定一个字符串(不含空格,长度小于500),在字符串的前后适当补充若干字符串,使整个字符串形成回文串,那么最少需要补充多少字符,并输出形成的回文串
分别从左右两侧判断回文情况,左侧判断时,每次过滤掉最右侧的字符,如果某次循环判断为回文,则记录本次判断的字符串长度。左右都判断完成后,比较左右两侧哪个回文串更长。字符串长度减去回文串长度即为需要补充的最少字符。
#include <iostream>
using namespace std;
bool hw(char *s,int n)
{
int i=0;
int j=n-i-1;
while(i<j)
{
if(s[i] != s[j])
break;
i++;
j--;
}
if(i<j)
return false;
return true;
}
int main()
{
char s[1000];
cin>>s;
int len = strlen(s);
int n = len;
int maxlen = 0;
int flag = 0;
while(n)
{
if(hw(s,n))
{
maxlen = n;
break;
}
n--;
}
n = len;
while(n > maxlen)
{
if(hw(s+len-n,n))
{
maxlen = n;
flag = 1;
break;
}
n--;
}
if(n == 0)
cout<<len-1;
else
{
cout<<len - maxlen<<endl;
if(flag == 0)
{
for(int i=0;i<len-maxlen;i++)
{
cout<<s[len-i-1];
}
cout<<s;
}
else
{
cout<<s;
for(int i=0;i<len-maxlen;i++)
{
cout<<s[len-maxlen-i-1];
}
}
}
return 0;
}