编者注:考题版权归属版权方,作答代码版权归属编者,请勿私自盗用。本代码仅供参考,还请各位读者不吝赐教。
回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的,有人认为回文串是一种完美的字符串。现在给你一个字符串,它不一定是回文的,请你计算最少的交换次数使得该字符串变成一个回文串。这里的交换指将字符串中两个相邻的字符互换位置。 例如所给的字符串为”mamad”,第一次交换a和d,得到”mamda”,第二次交换m和d,得到”madma”;第三次交换最后面的m和a,得到”madam”。
输入格式:
第一行是一个整数N(N <= 80),表示所给字符串的长度,第二行是所给的字符串,长度为N且只包含小写英文字母。
输出格式:
如果所给字符串能经过若干次交换变成回文串,则输出所需的最少交换次数;否则,输出Impossible。
输入样例:
5
mamad
输出样例:
3
编者注:考题版权归属版权方,作答代码版权归属编者,请勿私自盗用。本代码仅供参考,还请各位读者不吝赐教。
本题对应思路:具体思路
参考代码
#include <iostream>
using namespace std;
int main()
{
int n,i;
cin>>n;
string a;
cin>>a;
int b[30]={0};
//判断是否为回文串
for(i = 0;i<n;i++)
{
b[a[i]-'a']++;
}
int k = 0;
for(i = 0;i<26;i++)
{
if(b[i]%2!=0)
{
k++;
}
}
if(k>1)
{
cout<<"Impossible";
return 0;
}//先判断是否为回文串
//判断是否具有不在对应位置的字符
else{
int h = 0;
for(i = 0;i<(n+1)/2;i++)
{
int j;
int flag = 0;
for(j = n-1;j>i;j--)
{
if(a[i]==a[j])
{
flag = 1;
h += abs(j-(n-i-1));//题目仅仅要求输出交换次数,没有必要真正交换
//cout<<h<<' ';
}
}
if(!flag)
{
h+=abs(i-(n+1)/2);//奇数个的字符需要交换的次数
//cout<<h<<' ';
}
}
cout<<h;
}
}