ACMNO.50 完美的代价(主要是不同情况下面的讨论)

版权声明:转载请声明原文链接地址,谢谢! https://blog.csdn.net/weixin_42859280/article/details/89279762

题目描述

回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
 例如mamad
 第一次交换  ad  :  mamda
 第二次交换  md  :  madma
 第三次交换  ma  :  madam  (回文!完美!)

输入

第一行是一个整数N,表示接下来的字符串的长度(N  < =  8000) 
第二行是一个字符串,长度为N.只包含小写字母 

输出

如果可能,输出最少的交换次数。 
否则输出Impossible 

样例输入

5
mamad

样例输出

3

来源/分类

蓝桥杯—基础训练 

思路:

主要是不同情况下面的讨论,例如、abcd,aabb,abad,这个是偶数的代表。
思考出现impossible的条件。应当列就是出所有可以出现的情况。
其他解释,集合代码里面有。

代码:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a="";int n;	cin>>n;cin>>a;
	int i,j,t,l;j=n-1;//获取最后一个坐标
	int flag=0;	int step=0;//获取移动步数
	for(i=0;i<j;i++)
	{
		t=j;
		while(a[i]!=a[t])
		{
			t--;//往前面挪一位寻找下一个
		}
		char temp;//定义一个临时变量,每次都要重新定义。所以在for循环里面定义比较好。
		if(i==t)
		{//abcd,aabb,abad这三种情况。
			flag++;//运行之后flag是1.但是不大于1.只有再运行一次。才会触发Impossibe输出。
			if(n%2==0||flag>1)
			/*譬如,abcd就是N是4.这个是没希望的。
			但是aabb也是偶数,但是却可以。所以要分情况讨论*/
			{
				printf("Impossible");
				return 0;			
			}
			step+=n/2-i;//移动步数
			continue;
			/*计算机术语,表示结束本次循环,而不终止整个循环的执行。
			而是结束本次循环,进行下一次循环。 */
		}
		if(a[i]==a[t])//找寻到一样的,就通过一个临时变量来交换位置。
		{
			step+=j-t;//累加移动步数,就是最后一个元素位置。减去所找到匹配的元素的位置。
			temp=a[t];//提前保存好,后面将要消失的元素数值
			for(l=t;l<j;l++)
			{
				a[l]=a[l+1];//后面元素都向前面挪一位。			
			}
			a[l]=temp;//将提前保存好的元素数值,赋予在挪动过程中消失的那一个数值
			j--;//已经找到一个匹配的啦。首位和末尾互相对应
		}
	}
	cout<<step;
	//return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42859280/article/details/89279762
今日推荐