zoukankan      html  css  js  c++  java
  • 变位字

    什么是变位字?

    就是把一组字母或数字拆分成各种各样的组合,如: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行删掉(这两行是调试用的),运行就是这效果:

  • 相关阅读:
    File IO (Examples)
    File IO (AsciiToBinary / BinaryToAscii)
    Bit Operation (Message Compression/Decompression)
    Use GDB to debug code (2Example)
    Linked List in C (3Sorted List)
    在用户控件 ASCX 创建用户控件 ASCX
    恢复现有mongodb中的单个集合
    恢复现有mongodb中的单个集合
    WebForm与MVC混用
    WebForm与MVC混用
  • 原文地址:https://www.cnblogs.com/qq1871707128/p/6148052.html
Copyright © 2011-2022 走看看