字符串的排列


##題目描述 輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。

思路

回溯法

時間復雜度O(n!),空間復雜度O(n)。

代碼

import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    private ArrayList<String> list = new ArrayList<String>();
    
    private void swap(char[] s, int a, int b) {
        char t = s[a];
        s[a] = s[b];
        s[b] = t;
    }
    
    private void helper(char[] str, int k) {
        if(k == str.length - 1) {
            String s = String.valueOf(str);
            if(!list.contains(s)) {
                list.add(s);
            }
        } else {
            // 跟自身交換是最小的子問題
            for(int i = k; i < str.length; i++) {
                swap(str, i, k);
                // k代表圖中的層數
                helper(str, k+1);
                // 回溯
                swap(str, i, k);
            }
        }
    }
    
    public ArrayList<String> Permutation(String str) {
        if(str != null && str.length() != 0) {
            helper(str.toCharArray(), 0);
            Collections.sort(list);
        }
        return list;
    }
}

筆記

  • 回溯法比較容易想到,問題在於怎么實現從最小子問題回溯,即怎么從倒數兩個開始交換(如何到達遞歸樹底層)。
    這時思路中的圖就比較重要,需要理清遞歸樹如何分層的(k的意義)。

  • 先排序無效,圖中cba在cab之前。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM