41_字符串的排列

要求:輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串a(chǎn)bc,則打印出由字符a,b,c所能排列出來的所有字符串a(chǎn)bc,acb,bac,bca,cab和cba。
思路:使用全排列算法
方法見19_全排列遞歸算法

public class L39_permutation {
    // 全排列算法
    static ArrayList<String> res = new ArrayList<>();
    static char[] c;
    public static String[] permutation(String str) {
        // 將字符串轉(zhuǎn)化為數(shù)組
        c = str.toCharArray();
        int len = c.length;
        dfs(0,len);
        // 將ArrayList轉(zhuǎn)化為字符數(shù)組,先把鏈表的每個值取出來,然后拼接到一起,隔著",",利用字符分割split(",")切分成數(shù)組
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<=res.size()-1;i++){
            sb.append(res.get(i)+",");
        }
        String[] val = sb.deleteCharAt(sb.length()-1).toString().split(",");
        return val;
    }
    //遞歸
    public static void dfs(int m, int len){
        HashSet<Character> set = new HashSet<>();
        if(m == len){
            res.add(String.copyValueOf(c));
        }else{
            for(int i=m; i<len;i++){
                // 如果有重復的字符,要剪掉,即相同的字母只固定一次
                if(set.contains(c[i])) continue; // 重復,因此剪枝
                set.add(c[i]);
                // 交換,固定第一位
                char temp = c[m];
                c[m] = c[i];
                c[i] = temp;
                // 遞歸
                dfs(m+1, len);
                // 交換回去
                temp = c[m];
                c[m] = c[i];
                c[i] = temp;
            }
        }
    }

    public static void main(String[] args) {
        String[] str = permutation("abbb");
        int len = str.length;
        for(int i=0; i<len;i++){
            System.out.println(str[i]);
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容