【解题思路】
首先按照数字全排列的方式,对字符串进行全排列,代码如下:
class Solution {
public String[] permutation(String s) {
char[] ss = s.toCharArray();
int len = s.length();
ArrayList<String> list = new ArrayList<String>();
search(0, ss, len, list);
String[] ans = new String[list.size()];
for(int i = 0; i < list.size(); i++)
{
ans[i] = list.get(i);
}
return ans;
}
public void search(int n, char[] ss, int len, ArrayList<String> list)
{
if(n == len)
{
String a = String.valueOf(ss);
for(String str : list)
{
if(str.equals(a)) return;
}
list.add(a);
}
else
{
for(int i = n; i < len; i++)
{
char tmp = ss[i];
ss[i] = ss[n];
ss[n] = tmp;
search(n+1, ss, len, list);
tmp = ss[i];
ss[i] = ss[n];
ss[n] = tmp;
}
}
}
}
提交发现超过时间限制,而在本地,这个测试样例可以运行成功。
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();
backtrack(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 backtrack(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]);
backtrack(arr, i + 1, n, perm);
perm.deleteCharAt(perm.length() - 1);
vis[j] = false;
}
}
}