递归2

216 阅读2分钟

使用递归求字符串str的所有全排列

什么是全排列? 例如字符串str="abc"

第一个位置是a:
(第一个位置已被选,那么第一个位置右边的位置继续选)
	第二个位置是b:
	(第一个位置、第二个位置已被选,那么第二个位置右边的位置继续选)
		第三个位置是c:
			abc
	第二个位置是c:
	(第一个位置、第二个位置已被选,那么第二个位置右边的位置继续选)
		第三个位置是b:
			acb
第一个位置是b:
(第一个位置已被选,那么第一个位置右边的位置继续选)
	第二个位置是a:
	(第一个位置、第二个位置已被选,那么第二个位置右边的位置继续选)
		第三个位置是c:
			bac
	第二个位置是c:
	(第一个位置、第二个位置已被选,那么第二个位置右边的位置继续选)
		第三个位置是a:
			bca
第一个位置是c(第一个位置已被选,那么第一个位置右边的位置继续选)
	第二个位置是b:
	(第一个位置、第二个位置已被选,那么第二个位置右边的位置继续选)
		第三个位置是a:
			cba
	第二个位置是a:
	(第一个位置、第二个位置已被选,那么第二个位置右边的位置继续选)
		第三个位置是b:
			cab
综上:str的全排列有:【abc,acb,bac,bca,cba,cab】

代码如下所示:

public class Class1 {
    public static void main(String[] args) {
        String s = "abc";
        char[] chars = s.toCharArray();
        List<String> sequences = new ArrayList<String>();
        getAllSort(chars,0,sequences,"");
        for (String sequence : sequences) {
            System.out.println("sequence = " + sequence);
        }
    }


    /**
     * 获取一个字符串的所有全排列
     * @param chars 字符串变成一个个的字符
     * @param position 当前位置
     * @param allSorts 存放所有的全排列
     * @param sort 一个排列 --经过分析不需要该参数
     */
    private static void getAllSort(char[] chars,int position,List<String> allSorts,String sort){
        if(position == chars.length){
            allSorts.add(String.valueOf(chars));
            return;
        }

        for(int j=position;j<chars.length;j++){
            swap(chars,position,j);
            getAllSort(chars,position+1,allSorts,sort);
            swap(chars,position,j);
        }
    }

    /**
     * 交换char数组i和j位置的值
     * @param chars char数组
     * @param i i位置
     * @param j j位置
     */
    private static void swap(char[] chars,int i,int j){
        char temp = chars[i];
        chars[i] = chars[j];
        chars[j] = temp;
    }
}