题目:求一个字符串的全排列。
思路:我们可以生成一个解答树:拿字符串“bca”来说,此时如果我们处理到第cur个位置,那么我们可以和从当前这个位置开始依次和之后的位置互换字符,这样就能确保二叉树每一层(当前位置)的结果都能出现过了,然后接着递归下去。
package org;
import java.util.Arrays;
public class SortMethod {
public static void create(char a[], int cur, int n) {
if (cur == n) {
System.out.println(Arrays.toString(a));
return;
}
for (int i = cur; i < n; i++) {
char tmp = a[cur];
a[cur] = a[i];
a[i] = tmp;
create(a, cur+1, n);
tmp = a[cur];
a[cur] = a[i];
a[i] = tmp;
}
}
public static void main(String[] args) {
String a = "bba";
create(a.toCharArray(), 0, a.length());
}
}
题目:生成一个没有重复的全排列。
思路:和前面的有一些差别,首先我们要先明白如果能确保没有重复的可能出现,我们可以把每个重复出现过的字符依次标上一个下标,那么我只要保证每个生成的全排列的重复字符都能保持最原先的排列,也就是没有逆序,这样我们就能保证没有重复序列的生成了。多加一个for判断。
package org;
import java.util.Arrays;
public class SortMethod {
public static void create(char a[], int cur, int n) {
if (cur == n) {
System.out.println(Arrays.toString(a));
return;
}
for (int i = cur; i < n; i++) {
char tmp = a[cur];
a[cur] = a[i];
a[i] = tmp;
create(a, cur+1, n);
tmp = a[cur];
a[cur] = a[i];
a[i] = tmp;
}
}
public static void dul(char a[], int cur, int n) {
if (cur == n) {
System.out.println(Arrays.toString(a));
return;
}
for (int i = cur; i < n; i++) {
int vis[] = new int[30];
for (int j = 0; j < 30; j++) vis[j] = 0;
for (int j = i-1; j >= cur; j--) vis[a[j]-'a'] = 1;
if (vis[a[i]-'a'] == 1) continue;
char tmp = a[cur];
a[cur] = a[i];
a[i] = tmp;
dul(a, cur+1, n);
tmp = a[cur];
a[cur] = a[i];
a[i] = tmp;
}
}
public static void main(String[] args) {
String a = "bba";
//create(a.toCharArray(), 0, a.length());
dul(a.toCharArray(), 0, a.length());
}
}