劍指Offer38.字串的排序
阿新 • • 發佈:2020-12-27
題目連結:字串的排序
思路:全排列字元順序,要去重。先排序,因為想把重複的字元放在一起,這樣遍歷的時候方便處理重複的字串;然後遞迴地遍歷每個位置,組合所有情況。
程式碼:
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)
。