剑指 Offer.38-字符串的排列
剑指 Offer.38-字符串的排列
题目链接
问题描述
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素
官方解法(回溯)
通过回溯模拟排列树的构建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { List<String> res = new LinkedList<>(); char[] c; public String[] permutation(String s) { c = s.toCharArray(); recur(0); return res.toArray(new String[res.size()]); }
void recur(int index){ if(index == c.length-1) { res.add(String.valueOf(c)); return; } HashSet<Character> set = new HashSet<>(); for(int i = index;i < c.length;i++){ if(set.contains(c[i])) continue; set.add(c[i]); swap(i,index); recur(index+1); swap(i,index); } } void swap(int a,int b){ char tmp = c[a]; c[a] = c[b]; c[b] = tmp; } }
|