Playing With Strings

题目链接

题解: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值