标签:
第一部分:题目
第二部分:我的思路
1,能否变成回文串:记录每个小写字母的个数,只要奇数的个数不超过1就可以。
2,最少交换次数:贪心:从两端同时开始,不一样的时候需要找到最近的替换:两边的都可以替换,只要交换次数最小也就是最近。
第三部分:代码
#include<iostream> #include<stdio.h> using namespace std; int main() { int len; cin>>len; getchar();//接收cin的回车符 char s[8001]; int sum[27]={0};//用来记录26个小写字母的个数 gets(s); for(int i=0;i<len;i++) { sum[s[i]-‘a‘+1]++; } int t=0; //字母个数为奇数的总数超过1就不可能变成回文串。 for(int i=1;i<27;i++) { if(sum[i]%2!=0) { t++; } if(t>1) { break; } } if(t>1) { cout<<"Impossible"<<endl; } else { int count=0; int i,j; //从两端同时开始,不一样时用离左或右最近的替换:一个一个交换过来。 for(i=0,j=len-1;i<j;i++,j--) { if(s[i]!=s[j]) { int min=10000; int index; int flag=0; //可以替换左边的 for(int l=i+1;l<j;l++) { if(s[l]==s[j]) { if(min>l-i) { min=l-i; index=l; break; } } } //可以替换右边的 for(int l=j-1;l>i;l--) { if(s[l]==s[i]) { if(min>j-l) { min=j-l; index=l; flag=1; break; } } } count+=min; if(flag) { int t=s[index]; for(int k=index;k<j;k++) { s[k]=s[k+1]; } s[j]=t; } else { int t=s[index]; for(int k=index;k>i;k--) { s[k]=s[k-1]; } s[i]=t; } } } cout<<count<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/xiangguoguo/p/5503143.html