回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
思路:先判断是否能成为回文串,然后从头开始,从后找与之相同的字符,将其移动到末尾,然后末尾向前移动最终到达中心点
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char a[8001];
int main()
{
int n;
scanf("%d %s",&n,a);
int i,j,jw=n-1,step=0,flag=0,x;
char t;
for(i=0;i<jw;i++)
{
for(j=jw;j>=i;j--)
{
if(i==j)
{
if(n%2==0&&flag==1)
{
printf("Impossible\n");//单个字符+偶数个
return 0;//结束
}
flag=1;
step+=n/2-i;
}
else if(a[i]==a[j])
{
for(x=j;x<jw;x++)
{
t=a[x];
a[x]=a[x+1];
a[x+1]=t;
step++;//移动到对称位置
}
jw--;
break;
}
}
}
printf("%d\n",step);
return 0;
}