變位字


什么是變位字?

就是把一組字母或數字拆分成各種各樣的組合,如: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行刪掉(這兩行是調試用的),運行就是這效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM