一、题目

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

点击查看原题
难度级别:中等

二、思路

1)回溯法

首先,根据给定字符串,如何求出其全排列?
本题中回溯的主要思想是:使用loc表示当前位置,从大于等于loc的下标选择元素,来替换loc位置的元素,继续回溯
给出字符串有重复元素,那么也就是loc位置不能多次选择同一元素,使用一个hashset进行记录已经选择过的元素,遇到未选择过的元素才回溯

三、代码

1)回溯法

  1. class Solution {
  2. private List<String> ans;
  3. public String[] permutation(String s) {
  4. char[] cs = s.toCharArray();
  5. ans = new ArrayList();
  6. backTrace(cs, 0);
  7. return ans.toArray(new String[ans.size()]);
  8. }
  9. private void backTrace(char[] cs, int loc) {
  10. if (loc == cs.length) {
  11. ans.add(new String(cs));
  12. return;
  13. }
  14. Set<Character> set = new HashSet();
  15. for (int i = loc; i < cs.length; i++) {
  16. if (set.contains(cs[i])) {
  17. continue;
  18. }
  19. set.add(cs[i]);
  20. swap(cs, loc, i);
  21. backTrace(cs, loc + 1);
  22. swap(cs, loc, i);
  23. }
  24. }
  25. private void swap(char[] cs, int i, int j) {
  26. char c = cs[i];
  27. cs[i] = cs[j];
  28. cs[j] = c;
  29. }
  30. }

时间复杂度为O(n*n!),空间复杂度为O(n)