什么是變位字?
就是把一組字母或數字拆分成各種各樣的組合,如:abc 就有:abc 、 acb 、 bca 、 bac 、 cba 、 cab 6種,這就是變位字。
變位字有什么用?
關鍵字的查詢,數據庫的類似查詢等
直接上代碼:
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 5 /** 6 * 7 * 變位字的算法 8 * 9 */ 10 public class deflectionWord { 11 static int size; 12 static int count; 13 static char[] arrChar = new char[100]; 14 public static void main(String[] args) throws IOException{ 15 System.out.println("請用戶輸入一個單詞"); 16 String input = getString(); 17 size = input.length(); 18 count = 0; 19 for(int j=0;j<size;j++){ 20 arrChar[j] = input.charAt(j); 21 } 22 doAnagram(size); 23 } 24 //變位的方法 25 public static void doAnagram(int newSize){ 26 if(newSize==1){ //因為假設等0就退出的話,在rotate里面數組就超出了 27 return; 28 } 29 for(int j=0; j <newSize;j++){ 30 doAnagram(newSize-1); 31 if(newSize==2){ 32 // displayWord(); 33 } 34 displayWord(); 35 36 rotate(newSize); 37 } 38 } 39 //轉動的方法 40 public static void rotate(int newSize){ 41 int j; 42 int position = size - newSize; 43 System.out.println("----"+position); 44 char temp = arrChar[position]; 45 for(j=position+1;j<size;j++){ 46 arrChar[j-1] = arrChar[j]; 47 } 48 arrChar[j-1] = temp; 49 } 50 public static void displayWord(){ 51 if(count<99){ 52 System.out.print(" "); 53 } 54 if(count<9)System.out.print(" "); 55 System.out.print(++count+" "); 56 for(int j=0; j<size;j++){ 57 System.out.print(arrChar[j]); 58 } 59 System.out.print(" "); 60 System.out.flush(); 61 if(count%6==0){ //每行輸出6個 62 System.out.println(); 63 } 64 } 65 public static String getString() throws IOException{ 66 //從鍵盤中讀取字符 67 InputStreamReader isr = new InputStreamReader(System.in); 68 BufferedReader br = new BufferedReader(isr); 69 return br.readLine(); 70 } 71 }
先輸入abc測試,----后面的數字表示是哪個位置的數字需要往后移的:
然后再輸入abcd測試下:
請用戶輸入一個單詞 abcd 1 abcd ----2 2 abdc ----2 3 abcd ----1 4 acdb ----2 5 acbd ----2 6 acdb ----1 7 adbc ----2 8 adcb ----2 9 adbc ----1 10 abcd ----0 11 bcda ----2 12 bcad ----2 13 bcda ----1 14 bdac ----2 15 bdca ----2 16 bdac ----1 17 bacd ----2 18 badc ----2 19 bacd ----1 20 bcda ----0 21 cdab ----2 22 cdba ----2 23 cdab ----1 24 cabd ----2 25 cadb ----2 26 cabd ----1 27 cbda ----2 28 cbad ----2 29 cbda ----1 30 cdab ----0 31 dabc ----2 32 dacb ----2 33 dabc ----1 34 dbca ----2 35 dbac ----2 36 dbca ----1 37 dcab ----2 38 dcba ----2 39 dcab ----1 40 dabc ----0
分析:
原理是這樣的,比如abc,看代碼是先輸出然后再調用rotate(newSize)這個方法的,當遞歸到newSize為1時,就return,然后再執行newSize為2的下一步,因為是先輸出再顯示的,看代碼:
所以第一次就輸出abc,然后再進到rotate(2)的這個方法來,position就等於3-2=1,然后再存當前的position位置的字符也就是b,在for循環里面position又加1,相當於從最后一位開始,將最后的字符移前1位,j初始值為2,所以只循環一次。
第二次輸出acb,然后再進到rotate(2)的這個方法來,position就等於3-2=1,然后再存當前的position位置的字符也就是c,在for循環里面position又加1,相當於從最后一位開始,將最后的字符移前1位,j初始值為2,所以只循環一次。
第三次輸出abc,又回到最初的位置。然后再進到rotate(3)的這個方法來,position就等於3-3=0,然后再存當前的position位置的字符也就是a,在for循環里面position又加1,相當於從第二位開始,將的字符移前1位,j初始值為1,所以循環二次。 第一次是把b移到a的位置,第二次是把c移到b的位置。
第四次輸出bca,然后再進到rotate(2)的這個方法來,position就等於3-2=1,然后再存當前的position位置的字符也就是c,在for循環里面position又加1,相當於從最后一位開始,將的字符移前1位,j初始值為2,所以循環一次。
第五次輸出bac,然后再進到rotate(2)的這個方法來,position就等於3-2=1,然后再存當前的position位置的字符也就是a,在for循環里面position又加1,相當於從最后一位開始,將的字符移前1位,j初始值為2,所以循環一次。
第六次輸出bca,又回到最初的位置。然后再進到rotate(3)的這個方法來,position就等於3-3=0,然后再存當前的position位置的字符也就是b,在for循環里面position又加1,相當於從第二位位開始,將的字符移前1位,j初始值為1,所以循環二次。 第一次是把c移到b的位置,第二次是把a移到c的位置。
以下的我就不推了,直接上圖便於大家理解。
不知大家發現沒有,每次都是2的前面顯示出來的都是沒有重復的,因為兩次連續傳進來2,肯定有一次是重復的,比如:abc--->acb --->abc(重復了),所以就判斷一下,因為都在rotate的傳進來的值為2的時候先顯示,因為就只這個有效的,其他的都是重復的,所以把32行的注釋刪掉,把34行與43行刪掉(這兩行是調試用的),運行就是這效果: