字典序排列

字符串的全排列,普通递归如下:

import org.junit.Test;  
  
public class AllSort {  
  
    public void permutation(char[] buf, int start, int end) {  
        if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可  
            for (int i = 0; i <= end; i++) {  
                System.out.print(buf[i]);  
            }  
            System.out.println();  
        } else {// 多个字母全排列  
            for (int i = start; i <= end; i++) {  
                char temp = buf[start];// 交换数组第一个元素与后续的元素  
                buf[start] = buf[i];  
                buf[i] = temp;  
  
                permutation(buf, start + 1, end);// 后续元素递归全排列  
  
                temp = buf[start];// 将交换后的数组还原  
                buf[start] = buf[i];  
                buf[i] = temp;  
            }  
        }  
    }  
  
    @Test  
    public void testPermutation() throws Exception {  
        char[] buf = new char[] { 'a', 'b', 'c' };  
        permutation(buf, 0, 2);  
    }  
}  

详细的解析:
http://blog.csdn.net/randyjiawenjie/article/details/6313729

字典序算法如下:

假设这n个数的某一个排列为 P: P1 P2 P3...Pj-1 Pj Pj+1...Pk-1 Pk Pk+1...Pn

1.从该序列的最右端开始向左找出第一个比与自己相邻的右边数小的数,记其下标为j,即j = max{i|Pi

2.找出Pj右边比Pj大的最小数Pk.

3.交换Pj,Pk.此时序列变为 P’: P1 P2 P3...Pj-1 Pk Pj+1...Pk-1 Pj Pk+1...Pn

4.将Pj+1...Pn 倒转,即得到此序列的后一个序列 P”: P1 P2 P3...Pj-1 Pn...Pk+1 Pj Pk-1...Pj+1

例:

1 2 3 5 7 4 6 10 9 8为1-10的一个排列

1.从该序列的最右端开始向左找出第一个比与自己相邻的右边数小的数6,其下标为7

2.6右边比6大的最小数为8

3.交换6,8得到1 2 3 5 7 4 8 10 9 6

4.将P8-P10倒转得到:1 2 3 5 7 4 8 6 9 10即为下一个序列

实现如下:

package July.第一章;

import java.util.Arrays;
import java.util.stream.StreamSupport;

/**
 * Created by lenovo on 2016/12/1.
 * 字典序排列
 */


public class CalcAllPermutation_2 {
    //1,从右端开始扫描,若出现前一个比后一个小,记录前一个的元素下表index
    void getDictionary(char[] input){
        System.out.println(new String(input));
        int i=0;
       while (true){
           for ( i=input.length-1;i>0;i--){
               if (input[i-1]min&&input[i]

字符的所有组合:

package July.第一章;

import java.util.Arrays;
import java.util.stream.StreamSupport;

/**
 * Created by lenovo on 2016/12/1.
 * 字典序排列
 */


public class CalcAllPermutation_2 {
    //1,从右端开始扫描,若出现前一个比后一个小,记录前一个的元素下表index
    void getDictionary(char[] input){
        System.out.println(new String(input));
        int i=0;
       while (true){
           for ( i=input.length-1;i>0;i--){
               if (input[i-1]min&&input[i]= m; --i) { // 从后往前依次选定一个
                subchars[m - 1] = chars[i - 1]; // 选定一个后
                combination(chars, i - 1, m - 1, subchars, subn); // 从前i-1个里面选取m-1个进行递归
            }
        }
    }

    public static void main(String[] args){
        String input="adew";
        char [] c=input.toCharArray();
     //   Arrays.sort(c);
       // new CalcAllPermutation_2().getDictionary(c);
        combination(c);
    }
}

你可能感兴趣的:(字典序排列)