題目大體:順序排列DNA鏈,只有A和T,例如ATTTAA,如今科學家改變該鏈,改變時能夠單獨改變一個字母,也能夠把鏈裏的字母兩兩交換。
求:最短的交換次數
例如:ATTTAA --> TTAATT 最少須要3次交換,先把第一個A換成目標T,接着把第3個和第5個交換,第4個和第6個交換。3次搞定spa
若是有更好的辦法,歡迎點評,不足之處請提醒。code
1 package com.motorye; 2 3 public class T360 { 4 public static void main(String[] args) { 5 /*Scanner scanner1 = new Scanner(System.in); 6 String s1 = scanner1.nextLine(); 7 Scanner scanner2 = new Scanner(System.in); 8 String s2 = scanner2.nextLine();*/ 9 String s1 = "ATTTAA"; 10 String s2 = "TTAATT"; 11 int totalTimes = 0; 12 13 char[] s1_chars = s1.toCharArray(); 14 char[] s2_chars = s2.toCharArray(); 15 16 int s1_A = 0; 17 int s2_A = 0; 18 19 //這裏取A的次數 20 for(int i = 0; i<s1_chars.length; i++){ 21 if(s1_chars[i] == 'A'){ 22 s1_A++; 23 } 24 if(s2_chars[i] == 'A'){ 25 s2_A++; 26 } 27 } 28 29 //兩種極端,全等或全不等 30 if(s1_A - s2_A == 0 || s1_A - s2_A == s1_chars.length){ 31 totalTimes += Math.abs(s1_A - s2_A); 32 }else if(s1_A - s2_A != 0) { 33 //這裏寫的else if 加條件,便於理解 34 //兩者A數目不同時候,必須替換差值次。 35 totalTimes += Math.abs(s1_A - s2_A); 36 //換成數目同樣的之後,再兩兩替換 37 int k = 0; 38 int j = 0; 39 int i = k; 40 while(true){ 41 42 if(k == s1_chars.length){ 43 break; 44 } 45 if(j == s2_chars.length){ 46 break; 47 } 48 if(s1_chars[k] == s2_chars[j]){ 49 k++; 50 i = k; 51 j++; 52 }else { 53 //不相等,那就日後查找,直到相等的 54 while (s1_chars[i] != s2_chars[j]){ 55 if(i == s1_chars.length){ 56 break; 57 } 58 i++; 59 } 60 totalTimes+=1; 61 k++; 62 } 63 } 64 } 65 System.out.println(totalTimes); 66 } 67 }