完美的代价

题目描述

输入

输出

import java.util.*;
public class Main { 
    public static void main(String[] args) { 
        Scanner in=new Scanner(System.in); 
          while(in.hasNext()){
        	  int n=in.nextInt();
        	  String s=in.next();
        	  char[] ch=s.toCharArray();
        	  int i,j,k=0,cnt=0,single=0,end=n-1;
        	  //single用来记录只出现一次的字母个数
        	 for ( i = 0; i <end; i++) {//从左边第一个开始,从右边扫描寻找第一个与左边相同的字母
			   for (j=end; j>=0; j--) {
				   if(j==i){//说明走到了单个字母那里
					  single++;//记录个数
					 if(single>1||n%2==0){//如果字母长度为奇数并且单个字母个数多余一个或者如果字母长度为偶数但是出现了单个字母
						   System.out.println("Impossible");
						    k=1;//确定不可能回文了,设置k的值来退出外循环
						   break;
					    }
					 cnt+=n/2-i;//说明字母长度为奇数且单个字母只有一个,那么将它移到最中间
					  break;
				    }	
				   else{
					 if(ch[j]==ch[i]){//从右边找到了,将所有字母从右往左进行移动
					   for (int l = j; l <end; l++)
							ch[l]=ch[l+1];
					    ch[end]=ch[i];//满足回文的字母排出去
					    cnt+=end-j;
						end--;//缩小边界
					    break;
					 }					 
				   }
				}
			   if(k==1)
				   break;
        	 }
             if(k==0)
			   System.out.println(cnt);
          }                  
      }     
    } 
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值