蓝桥杯 基础练习 完美的代价

问题描述
  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)
输入格式
  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母
输出格式
  如果可能,输出最少的交换次数。
  否则输出Impossible
样例输入
5
mamad
样例输出
3

思路:
1.字符串中最多存在一个出现次数为奇数的字母,超过一个时输出impossible
2.从后向前找到第一个和首字母相同的字母,并将他移动到相应的位置。
3.重复步骤二,直到剩下出现次数为奇数的字母,将他从现在的位置移动到中间的位置。
代码如下:

#include 
#include 
#include 
int main()
{
    int l;
    scanf("%d",&l);
    char a[l];
    getchar();
    gets(a);
    int b[26]={0},i;
    for(i=0;i<l;i++)   //统计出现次数
    {
        b[a[i]-'a']++;
    }
    int k=0;
    for(i=0;i<26;i++)  //统计有多少出现次数为奇数的字母
    {
        if(b[i]%2!=0)
            k++;
    }
    if(k>=2)  //超过两个不符合
    {
        printf("Impossible");
    }
    else    
    {
        int h=0,g=l,m=0;
        for(i=0;i<(l+1)/2;i++)  //前半段
        {
            int j;
            for(j=g-1;j>i;j--)    //从后往前找
            {
                if(a[i]==a[j])   //寻找成功
                {
                    while(j<g-1)   //移动交换
                    {
                        char t;
                        t=a[j];
                        a[j]=a[j+1];
                        a[j+1]=t;
                        j++;
                        h++;
                    }
                    g--;
                    break;
                }
            }
            if(j==i)    //将成单的字母移动到中央
                m=(l-1)/2-i;
        }
        printf("%d",h+m);
    }
    return 0;
}

你可能感兴趣的:(蓝桥杯)