7-4 完美的代价 (40分)
回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的,有人认为回文串是一种完美的字符串。现在给你一个字符串,它不一定是回文的,请你计算最少的交换次数使得该字符串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置。 例如所给的字符串为”mamad”,第一次交换a和d,得到”mamda”,第二次交换m和d,得到”madma”;第三次交换最后面的m和a,得到”madam”。
#include <stdio.h>
int main()
{ int n,i,j,k,flag=0,l,t=-1;
char s[100],ch,c=0;
scanf("%d",&n);
getchar();
gets(s);
j=n-1;
for(i=0;i<j;i++)
{ for(k=j;k>=i;k--)
{ if(k==i)
{ if(n%2==0||n%2!=0&&flag==1)
{ printf("Impossible");
return 0;
}
flag=1;
t=i;
}
else{
if(s[k]==s[i])
{ for(l=k;l<j;l++)
{ ch=s[l];
s[l]=s[l+1];
s[l+1]=ch;
c++;
}
j--;break;
}
}
}
}
if(t!=-1)
{
if(t<=n/2)
for(l=t;l<n/2;l++)
{ ch=s[l];
s[l]=s[l+1];
s[l+1]=ch;
c++;
}
else{
for(l=t;l>n/2;l--)
{ ch=s[l];
s[l]=s[l-1];
s[l-1]=ch;
c++;
}}
}printf("%d",c);
return 0;
}