基础练习 完美的代价


基础练习 完美的代价  
时间限制:1.0s   内存限制:512.0MB
问题描述
  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)
输入格式
  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母
输出格式
  如果可能,输出最少的交换次数。
  否则输出Impossible
样例输入
5
mamad
样例输出
3


1.从左往右获取charArray[i],对于每一个charArray[i]从右往左遍历找到charArray[j]与之相匹配。


2.若没有匹配,(1)字符串长度为奇数则可能是最中间的字符:

                         记录charArray[i](全程序只记录一次),与前一位置交换,交换次数记一次,
                           即: charArray[i]=charArray[i+1];
                         对于此时的charArray[i]继续执行1

                         若还有不能匹配且不等于charArray[i]的,说明不能匹配成回文,输出Impossible

                     (2)字符串长度为偶数 则不能形成回文,输出Impossible


 3.若匹配,则将charArray[j]交换到相匹配的位置(与charArray[j]对称的位置)。并记录交换次数。输出次数


import java.util.Scanner;
public class Main {
	public static void main(String[] args) { 
		boolean b=true; //是否匹配
		char x1 = 0 ;//x1记录字符串长度为奇数且第一次未匹配,x2记录第二次未匹配。
		int sum = 0;//交换次数
        Scanner sc=new Scanner(System.in);
        int n = sc.nextInt();
        char[] charArray = new char[n];
        charArray = sc.next().toCharArray();//输入的字符串转化为字符数组
        //i表示从左往右未匹配字符的下标
        //j表示从右往左未匹配的字符下标
        for (int i = 0; i < charArray.length/2; i++) {
        	//如果不能能匹配(字符串长度为奇数)
        		//从右向左找与左边下标为i的字符相匹配的
        		for (int j = i; j < charArray.length-1-i; j++) {
        			//如果匹配
	        		if(charArray[i] == charArray[charArray.length-1-j]){
	        			
	        			b=true;
	        			//如果左右不对称则交换
		        			if(i!=j){
		        				char a = charArray[charArray.length-1-j];
			        				for (int k = j; k > i; k--) {
			        					sum++;
			        					charArray[charArray.length-1-k] = 
			        						charArray[charArray.length-k];
			        				}
		        				charArray[charArray.length-1-i] = a;
		        				
		        			}
		        			break;//匹配完成就跳出j的循环
	        		}else{
	        			 b=false;
	        			 //若最后一次未匹配到,则保存charArray[i]
	        			 if(j==charArray.length-i-2&&charArray[i] != 
	        					 charArray[charArray.length-1-j]){
	        				  if(x1 ==charArray[i]||x1==0)
	        					  x1 = charArray[i];
	        			 }
	        		}
        		}
        		if(b==false){
            		if(charArray.length%2==1&&charArray[i]==x1){
            			sum++;
		        		char g = charArray[i+1];
		        		charArray[i+1]=charArray[i];
		        		charArray[i]=g;
		        		b=true;
    	        		i--;//重新匹配charArray[i];
            		}else
            			break;
            	}
		}
        if(b)
        	System.out.println(sum);
        else
        	System.out.println("Impossible");
    } 
}
不对之处请多指教!




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值