題目
輸入一個字符串,打印出該字符串中字符的所有排列。
你可以以任意順序返回這個字符串數組,但里面不能有重復元素。
示例:
輸入: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;}}
}