回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Basic19 {
public static void main(String[] args) throws IOException {
//键盘输入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//定义字符串的长度
int len = Integer.parseInt(reader.readLine());
//将输入的字符串转化为字符数组
char [] s = reader.readLine().toCharArray();
reader.close();//关闭字符流
if(palindrome(s, 0, len-1)){
//System.err.println(len-1);
System.out.println(num);
}else{
System.out.println("Impossible");
}
}
//判断输入的字符是不是回文数字
public static boolean Panduan(String str){
boolean flag = true;
for (int i = 0;i<str.length()/2;i++){
if(str.charAt(i)!=str.charAt(str.length()-1-i)){
flag = false;
return flag;
}
}
return flag;
}
private static int num = 0;//用来记录移动的次数
private static boolean haveMiddle = false;
//s 是要断定的字符数组 a 是字符数组的起始位置,b是终止位置
private static boolean palindrome(char[] s,int a,int b) {
if (b<=a){
return true;
}
//从最后的位置开始遍历字符串
for(int i=b;i>a;i--){
if(s[a]==s[i]){
exchangeTo(s, i, b);
num += getExchangeTime(i, b);
//for(int dd = 0;dd<s.length;dd++){
//System.out.print("s:"+s[dd]+" ");
//}
//System.out.println();
return palindrome(s, a+1, b-1);
}
}
if(!haveMiddle){
haveMiddle= true;
num+=getExchangeTime(a, s.length/2);
return palindrome(s, a+1, b);
}
return false;
}
private static int getExchangeTime(int a,int b){
return b-a;
}
private static void exchangeTo(char [] s,int a,int b){
//System.out.println("a:"+a+"b:"+b);
char temp = s[a];
for(int i=a;i<b;i++){
//System.err.println(s[i]+":"+s[i+1]);
s[i]= s[i+1];
//System.out.println(s[i]+":"+s[i+1]);
}
s[b] = temp;
}
}