BASIC-19 完美的代价
问题描述
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
否则输出Impossible
样例输入
5
mamad
mamad
样例输出
3
import java.util.Scanner; public class Test1 { static int count =0;//计算步数 static boolean b;//单独字母出现时的操作 static boolean prefect(char[]c,int begin,int end){ if(end<=begin){ return true; } //end开始,依次与begin比较 for(int i=end;i>begin;i--){ if(c[begin]==c[i]){ change(c,i,end); count+=steps(i,end); return prefect(c,begin+1,end-1);//begin后移,end前移 } } //第一次出现单独字母移至中心位,第二次是出现返回false if(!b){ b=true; count+=steps(begin,c.length/2); return prefect(c,begin+1,end);//结束位置不变,开始位置向前逼近。 } return false; } static void change(char[]c,int a,int b){ char temp=c[a]; for(int i=a;i<b;i++){ c[i] = c[i+1]; } c[b] = temp; } static int steps(int a,int b){ return b-a; } public static void main(String[] args) { Scanner s = new Scanner(System.in); int m=s.nextInt(); Scanner s1=new Scanner(System.in); String st = s1.nextLine(); char[] c = st.toCharArray(); s.close(); s1.close(); if(prefect(c,0,m-1)){ System.out.println(count); }else{ System.out.println("Impossible"); } } }