题解:palindrome 名词 回文 lexicographically 名词 字典序
给你一串字符,若它可以组成回文字符串,请按照字典序输出其回文串。若果不可以,请输出impossible。
Examples
Input
4
abacb
acmicpc
aabaab
bsbttxs
Output
abcba
impossible
aabbaa
bstxtsb
Note
Palindrome string is a string which reads the same backward or forward.
Lexicographic order means that the strings are arranged in the way as they appear in a dictionary.
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char ch,a[1010];
int i,j,ans;
int num[1010];
memset(num,0,sizeof(num));
scanf("%s",a);
for(i=0; a[i]; i++)
{
a[i]=a[i]-'a';
num[a[i]]++;
}
ans=0;
for(i=0; i<26; i++)
{
if(num[i]%2!=0)
ans++;
}
if(ans>1)
{
printf("impossible\n");
continue;
}
for(i=0; i<26; i++)
{
if(num[i]%2!=0) ch=i+'a';
if(num[i]!=0)
{
for(j=0; j<num[i]/2; j++)
{
printf("%c",i+'a');
}
}
}
if(ans==1)
printf("%c",ch);
for(i=25; i>=0; i--)
{
if(num[i]!=0)
{
for(j=0; j<num[i]/2; j++)
{
printf("%c",i+'a');
}
}
}
printf("\n");
}
return 0;
}
构思的巧妙之处:1.题目要求按照字典序输出,可以借用它ASCLL代码的值对其进行正向输出和反向输出。
2.由于其ASCLL编码值规律,a,b,c…每次增加一,如果记不清楚a,z的ASCLL码,可以采用本题的 -‘a’ 的方法处理。这样有两个优点:第一:统计每个字符出现的次数方便。第二:范围明显0-26(不包括26包括0)有一个易错点:★最后输出的时候别忘了+‘a’。
第一次未能AC的原因:
1.从25-0输出回文串的右半边时:①写成了26-0 ②写成了i++
2.保存字符ch:这种情况下应该是只有一个奇数个的字符,但却不一定是1个。比如输出accca。