天天看点

字符串的排列字符串的排列

字符串的排列

题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

分析:字符串拆成字符数组以便重组,使用交换字符顺序的方法,先确定第一个位置有多少种字符在上面,然后剩下后面的字符等待排序,再确定下一个位置,就可以使用递归。

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    ArrayList<String> res = new ArrayList<String>();  // 用于返回的数组
    public ArrayList<String> Permutation(String str) {
        if(str == null)
            return res;
        PermutationAux(str.toCharArray(), 0);
        Collections.sort(res);
        return res;
    }
    /**递归函数,将字符串的排列加入数组
    * @param: 字符数组,确认下标位置
    * @return: 无
    */
    public void PermutationAux(char[] str, int i){
        if(i == str.length - 1){
            res.add(String.valueOf(str));
        }else{
            for(int j = i; j < str.length; j++){
                if(j != i && str[i] == str[j])
                    continue;
                swap(str, i, j);
                PermutationAux(str, i+1);
                swap(str, i, j);  // 注意还原位置
            }
        }
    }
    /** 交换字符数组两个位置
    * @param: 字符数组,位置i,位置j
    * @return: 无
    */
    public void swap(char[] str, int i, int j) {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }
}