变位字
什么是变位字?
就是把一组字母或数字拆分成各种各样的组合,如: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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
