【字符串】剑指 Offer 38. 字符串的排列 (递归) (难,再来一次)
题目:
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
限制:
1 <= s 的长度 <= 8
解答:
方法一:(递归)
时间复杂度:O(n!)
空间复杂度:O(n!)
class Solution { List<String> res = new LinkedList<>(); char c[]; public String[] permutation(String s) { c = s.toCharArray(); dfs(0); return res.toArray(new String[res.size()]); } void dfs(int x){ if(x == c.length-1){ res.add(String.valueOf(c));//添加新的排列方案 return; } HashSet<Character> set = new HashSet<>(); for(int i = x;i<c.length;i++){ if(set.contains(c[i])) continue;//排列中有重复的字符,因此剪枝 set.add(c[i]); swap(i,x); //交换,将c[i]固定在第x位 dfs(x+1); //开启固定第 x+1 位字符 swap(i,x); //恢复交换 } } void swap(int a,int b){ char tmp = c[a]; c[a] = c[b]; c[b] = tmp; } }

浙公网安备 33010602011771号