木子CoCo~


私信TA

用户名:uq_78084890535

访问量:8476

签 名:

等  级
排  名 1169
经  验 3134
参赛次数 1
文章发表 24
年  龄 20
在职情况 学生
学  校 泰州学院
专  业 计算机科学与技术

  自我简介:

努力是奇迹的别名!

解题思路:

1.Impossible

maamdmaam--->奇数个字符出现的次数为1或0时才能实现回文

统计 每个字符出现的次数,如果出现奇数的次数>1时,这时表示不能实现回文

a--z

实现回文交换

mammaaaaadm://可以使用循环交换,也可以使用递归交换(case采用递归交换)

2.从最后面查找第1个出现的位置

3.将一个字符交换到指定的位置

dmama--->mdama

4.奇数个字符的处理 


参考代码:

#include<iostream>
#include<cstring>
#include<cstdio> 
using namespace std;
char arr[8005];
int b[30]; 
int N,count;
int main(){
	//输入 
	cin>>N;
	for(int i=0;i<N;i++){
		cin>>arr[i]; 
		b[arr[i]-'a']++;
	}
	//统计字符串中每个字符出现的次数 
	//如果字符串中有字符单数的次数>1,表示不可能交换成回文数 
	for(int i=0,flag=0;i<26;i++){
		if(b[i]%2==1){
			if(++flag>1){
			    cout<<"Impossible"<<endl;
				return 0;
			}
		}
	}
	int start=0,j,flag;
    for(int i=0;i<N/2;i++){
	     flag=0;
    	 for(j=N-i-1;j>i;j--){
    		if(arr[i]==arr[j]){
    				for(int start=j;start<N-i-1;start++){
		               char temp=arr[start];
		               arr[start]=arr[start+1];
		               arr[start+1]=temp;
		               count++;
	                }
	                break;//第一次出现相等的时候 
    		}		
        }
	    if(j==i){
    	  char temp=arr[i];
		  arr[i]=arr[i+1];
		  arr[i+1]=temp;
		  count++;
		  flag=1;
    	}
    	if(flag==1){
    		i--;
    	}
    }
	
    cout<<count<<endl;
}

PS:欢迎小伙伴多多交流!!!

后期会继续完善代码及解题思路~~~

 

0.0分

0 人评分

  评论区

  • «
  • »