题意:给定一个字符串,添加任意一个字母,使之成为回文串。
我一开始的思路是模拟,就是一开始就判断能不能回文,找回文中点,然后再直接输出回文结果,显然很麻烦。要考虑字符串的长度为偶数奇数,还有中点是添加的还是现成的。
所以此方案不通。
接下来的思路很简单,暴力,在每个位置添加一个字母,判断是否回文,直到找到正确解。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1000+5;
char ch[MAX_N],chd[MAX_N];
int n,sign[MAX_N],d[10];
bool sol()
{
bool flag=1;
for(int i=0;i<=n;i++){
if(ch[i]!=ch[n-i]){
flag=0;
break;
}
}
return flag;
}
void add(int i,int d)
{
if(i==n) ch[n]=char(d);
else {
for(int j=n-1;j>=i;j--){
ch[j+1]=ch[j];
if(j==i) ch[i]=char(d);
}
}
}
int main()
{
scanf("%s",ch);
strcpy(chd,ch);
n=strlen(ch);
memset(sign,0,sizeof(sign));
memset(d,-1,sizeof(d));
for(int i=0,j=0;i<n;i++){
if(sign[ch[i]]==0){
sign[ch[i]]++;
d[j++]=ch[i];
}
}
for(int i=0;i<10;i++){
if(d[i]==-1) break;
for(int j=0;j<=n;j++){
add(j,d[i]);
if(sol()){
for(int i=0;i<=n;i++){
cout<<ch[i];
}
cout<<endl;
return 0;
}
strcpy(ch,chd);
}
}
cout<<"NA"<<endl;
return 0;
}