Permutation大部分都能用递归+回溯解决

先build一个charCount把字符串中每个字母的count记下来
recurse的时候从a-z依次选count>0的字母append到输出字符串。

时间: O(n!)
空间: O(n) 栈高
import java.util.*;

public class Solution {
    ArrayList<String> ans = new ArrayList<>();

    public ArrayList<String> Permutation(String str) {
      int[] charCount = new int[26];
      for (char c : str.toCharArray())
        charCount[c-'a']++;
      
      recurse(charCount, str.length(), new StringBuilder());
      return ans;
    }
  
    public void recurse(int[] charCount, int strlen, StringBuilder sb) {
      if (sb.length() == strlen) {  // basecase
        ans.add(sb.toString());
        return;
      }

      for (int i = 0; i < 26; i++) {
        if (charCount[i] != 0) {
          charCount[i]--;
          sb.append((char)('a'+i));
          recurse(charCount, strlen, sb);
          // 回溯
          sb.deleteCharAt(sb.length()-1);
          charCount[i]++;
        }
      }
    }
}