1. 程式人生 > 實用技巧 >劍指Offer38.字串的排序

劍指Offer38.字串的排序

題目連結:字串的排序
思路:全排列字元順序,要去重。先排序,因為想把重複的字元放在一起,這樣遍歷的時候方便處理重複的字串;然後遞迴地遍歷每個位置,組合所有情況。
程式碼:

class Solution {
    private List<String> list = new ArrayList<>();
    public String[] permutation(String s) {
        char[] ss = s.toCharArray();
        int[] vis = new int[s.length()];
        Arrays.sort(ss);
        helper(ss, vis, new StringBuilder());
        return list.toArray(new String[list.size()]);
    }

    private void helper(char[] ss, int[] vis, StringBuilder sb){
        if(sb.length() >= ss.length){
            list.add(sb.toString());
            return ;
        }
        for(int i=0; i<ss.length; i++){
            if(vis[i] == 1) continue;
            vis[i] = 1;
            sb.append(ss[i]);
            helper(ss, vis, sb);
            vis[i] = 0;
            sb.deleteCharAt(sb.length() - 1);
            while(i+1<ss.length && ss[i] == ss[i+1]) i++;
        }
    }
}

執行用時:10 ms, 在所有 Java 提交中擊敗了76.72%的使用者
記憶體消耗:42.7 MB, 在所有 Java 提交中擊敗了86.46%的使用者

筆記

  • 題解中,通過交換字元順序實現組合,這樣就不用記錄訪問了哪個元素,因為被訪問的元素都通過交換放到了每層遞迴的前列。
  • List轉陣列的方法:<T> T[] List.toArray(T[] a)