变位字

什么是变位字?

就是把一组字母或数字拆分成各种各样的组合,如: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){
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 ){
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){
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){
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测试下:

请用户输入一个单词
abcd1 abcd  ----22 abdc  ----23 abcd  ----14 acdb  ----25 acbd  ----26 acdb  
----17 adbc  ----28 adcb  ----29 adbc  ----110 abcd  ----011 bcda  ----212 bcad  
----213 bcda  ----114 bdac  ----215 bdca  ----216 bdac  ----117 bacd  ----218 badc  
----219 bacd  ----120 bcda  ----021 cdab  ----222 cdba  ----223 cdab  ----124 cabd  
----225 cadb  ----226 cabd  ----127 cbda  ----228 cbad  ----229 cbda  ----130 cdab  
----031 dabc  ----232 dacb  ----233 dabc  ----134 dbca  ----235 dbac  ----236 dbca  
----137 dcab  ----238 dcba  ----239 dcab  ----140 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行删掉(这两行是调试用的),运行就是这效果:

 

转载于:https://www.cnblogs.com/qq1871707128/p/6148052.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部