测试样例不是很多可能有错
编写程序:完美(回文串)的代价(10分)
回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
交换的定义是:交换两个相邻的字符
例如mamad
第一次交换 ad : mamda
第二次交换 md : madma
第三次交换 ma : madam (回文!完美!)
输入格式
第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
第二行是一个字符串,长度为N.只包含小写字母
输出格式
如果可能,输出最少的交换次数。
否则输出Impossible
样例输入
5
mamad
样例输出
3
解题思路:
从头开始
例如:mamad
第一个字母为m---->从最后开始找m,找到m后把m移到最后一个
然后再第二个字母,依次类推;(不用考虑数组长度)
注意:移动时是诸位移动不能直接换
代码:
import java.util.*;
public class three53 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
String a=in.next();
char b[]=a.toCharArray();
int[] check=new int[26];
for(int i=0;i<n;i++) {
check[b[i]-97]++;
}
int flag=0;//出现次数为奇数的字母的个数
for(int i=0;i<16;i++) {
if(check[i]%2!=0) {
flag++;
}
}
if((flag>1)||(flag==1&&n%2==0)) {//不可能构成回文数的情况
System.out.println("Impossible");
}
else {//可能构成回文数的个数
int count=chang(b,n);
System.out.println(count);
}
}
static int chang(char[] b,int n) {//交换
int count=0;
for(int i=0;i<n/2;i++) {
int sum=0;
for(int j=n-1;j>i;j--) {
if(b[j]==b[i]) {
for(int k=j;k<n-i-1;k++) {
char x=b[k];
b[k]=b[k+1];
b[k+1]=x;
sum++;
}
break;
}
}
count+=sum;
}
return count;
}
}