问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
代码:
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int N;
string s;
cin >>N>>s;
int step = 0;//定义交换步骤
bool flag = false;
for(int i = 0; i < N-1; i++)//顺序遍历每个字符
{
for(int j = N-1; j >= i; j--)//逆序遍历每个字符
{
if(i == j)//遍历到同一个位置,意味着没有找到相同的字符
{
if(N % 2 == 0 || flag == true)//如果是偶数,没有形成回文数则输出
{ //如果是奇数,flag变为true,没有形成回文数则输出
cout <<"Impossible"<< endl;
return 0;
}
flag = true;
}
else if(s[i] == s[j])//找到相同的字符
{
for(int k = j; k < N-1; k++)//向后遍历交换
{
swap(s[k],s[k+1]);//交换
step++;//交换步骤自加
}
N--;//交换后,再次遍历只需从倒数第二个开始即可,以此类推
break;//跳出i=0的循环,从下一个字符开始遍历
}
}
}
cout <<step<<endl;
return 0;
}