#include <iostream>
#include <map>
using namespace std;
int main()
{
int N;
string hw;
cin>>N;
cin>>hw;
/*
回文字符串的判定:
1使用一个map容器,来统计字符串中每个字母出现次数
2一个字符串的长度可能是奇数个也可能是偶数个
3如果是偶数个字符,那么每个字母都必须出现偶数次才能构成回文字符串
4如果是奇数个字符,那么只有一个字母能出现奇数次。
5也就是说,如果出现两个次数为奇数次的字母,一定不是回文字符串。
*/
map<char,int> a;
for(int i=0;i<hw.length();i++)
a[hw[i]]++;
int sum=0;
map<char,int>::iterator it;
for(it=a.begin();it!=a.end();it++)
if(it->second%2!=0)
{
sum++;
if(sum==2)
break;
}
if(sum==2)
cout<<"Impossible"<<endl;
else
{
int i;
int j;
int number=0;
int l=hw.length()-1;//一个从字符串末尾开始递减指针,在其后面的字符串都已经满足回文的要求
for(i=0;i<=(hw.length()-1)/2;i++)//
{
for(j=l;j>i;j--)//从字符串不满足回文要求的最后一位开始向前寻找与i所只想相同的字符
{
if(hw[i]==hw[j])
{
while(j<l)// 交换
{
swap(hw[j],hw[j+1]);
number++;
j++;
}
l--;
break;
}
}
if(i==j)//j遍历到i也没有找到符合要求的字符,说明该字符串是奇数个字符按,并且i现在指向的恰好为那个中间的字符。
{
number+=(hw.length()-1)/2-i;//从i的位置交换到中间位置
}
}
cout<<number;
}
return 0;
}
蓝桥杯 basic19 完美的代价
最新推荐文章于 2021-07-23 15:06:41 发布