题目
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
解题思路
-
将字符串转化为字符数组,每次在字符数组中,选择一个字符填入特定位置,并记录下已经使用了的字符,当字符都用完以后产生的字符序列就是其中一个排列
-
因为1 <= s 的长度 <= 8,所以可以直接使用byte记录下已经被选择的字符
代码
class Solution {Set<String> res=new HashSet<>();public String[] permutation(String s) {char[] chars = s.toCharArray();bcP(chars,0, (byte) 0,new StringBuilder());String[] ress = new String[res.size()];Iterator<String> iterator = res.iterator();for (int i = 0; i < res.size(); i++) {ress[i]=iterator.next();}return ress;}public void bcP(char[] chars,int cur,byte check,StringBuilder stringBuilder){if(cur==chars.length){res.add(stringBuilder.toString());}for (int i=0,th=1<<(chars.length-1);i<chars.length;i++,th>>=1){if((th&check)!=0)continue;check^=th;stringBuilder.append(chars[i]);bcP(chars,cur+1,check,stringBuilder);stringBuilder.deleteCharAt(stringBuilder.length()-1);check^=th;}}
}