1.思路:
可以把问题看作是由n个空位,把字符串中的元素插入空位,得到不同的组合。
用backtrick(i, perm)表示把元素插入到第i个空位,perm当前排列:
当i = n时,表示空位已经插完,返回perm即可;
当i < n 时,需要把元素插入。为了使得排列中元素不重复,引入标志数组 boolean vis[n] 需要限定元素为从左开始第一个未插入的元素:(vis[i] || i > 0 && S!vis[i-1] && s[i-1] == s[i]) )
将不同的组合保存在lsi中,最后转换成字符串数组返回即可。
2.代码:
class Solution {
List<String> rec;
boolean[] vis;
public String[] permutation(String s) {
int n = s.length();
rec = new ArrayList<String>();
vis = new boolean[n];
char[] arr = s.toCharArray();
Arrays.sort(arr);
StringBuffer perm = new StringBuffer();
backtrick(arr, 0, n, perm);
int size = rec.size();
String[] recArr = new String[size];
for(int i = 0; i < size; i++){
recArr[i] = rec.get(i);
}
return recArr;
}
public void backtrick(char[] arr, int i, int n, StringBuffer perm){
if(i == n){
rec.add(perm.toString());
return;
}
for(int j = 0;j < n;j++){
if(vis[j] || (j > 0 && !vis[j - 1] && arr[j - 1] == arr[j]))
continue;
vis[j] = true;
perm.append(arr[j]);
backtrick(arr, i+1, n, perm);
perm.deleteCharAt(perm.length() - 1);
vis[j] = false;
}
}
}