贪心算法——完美的代价

来源:互联网 发布:sqlserver 图标 编辑:程序博客网 时间:2024/05/17 22:43
/*问题描述
  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad

  第一次交换 ad : mamda

  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)
输入格式
  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母
输出格式
  如果可能,输出最少的交换次数。
  否则输出Impossible
样例输入
5
mamad
样例输出
3

*/


import java.util.Scanner;class Task implements Runnable{private char[] cString = new char[] {'m','a','m','a','d'};public Task() {}public Task(char[] cString) {this.cString = cString;}@Overridepublic synchronized void run() {//总步数int sum = 0;//输入字符串不能达到目标要求的标志int flag = 0;//不止一个无相同的字符int single = 0;//代码优化int n = cString.length;//尾指针指向int point = n-1;for (int i = 0;i < n;i++) {for(int j = point;j >= i;j--) {if(i == j) {if(n % 2 == 0 || single != 0) {flag = 1;break;}sum += n/2 - i;single = 1;break;}if(cString[i] == cString[j]) {for(int k = j;k < point;k++) {cString[k] = cString[k+1];}cString[point] = cString[i];sum += point - j;point--;break;}}if(flag == 1) {break;}}System.out.println(flag == 1?"impossible":"最少交换次数:"+sum);}}public class Step1 {public static void main(String[] args) {//Scanner scanner = new Scanner(System.in);//int n = scanner.nextInt();//scanner.nextLine();//清除nextInt在缓冲区留下的“\r”//String string = scanner.nextLine();//char[] cs = string.toCharArray();//Task task = new Task(cs);Task task = new Task();new Thread(task).start();}}



原创粉丝点击