Java 字典序 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
时间: 2024-02-13 22:02:42 浏览: 93
可以使用字典序法来实现全排列,具体步骤如下:
1. 从右往左找到第一个左边小于右边的字符位置 k;
2. 从右往左找到第一个大于位置 k 的字符位置 l;
3. 交换位置 k 和位置 l 的字符;
4. 反转位置 k 右边的所有字符。
Java 代码如下:
```
public static void permutation(String str) {
char[] array = str.toCharArray();
Arrays.sort(array); // 先排序,使得字符串中的字母已经按照从小到大的顺序排列
while (true) {
System.out.println(new String(array)); // 输出当前排列
int k = -1;
for (int i = array.length - 2; i >= 0; i--) { // 从右往左找到第一个左边小于右边的字符位置 k
if (array[i] < array[i + 1]) {
k = i;
break;
}
}
if (k == -1) { // 已经是最后一个排列
break;
}
int l = -1;
for (int i = array.length - 1; i > k; i--) { // 从右往左找到第一个大于位置 k 的字符位置 l
if (array[i] > array[k]) {
l = i;
break;
}
}
swap(array, k, l); // 交换位置 k 和位置 l 的字符
reverse(array, k + 1, array.length - 1); // 反转位置 k 右边的所有字符
}
}
private static void swap(char[] array, int i, int j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
private static void reverse(char[] array, int begin, int end) {
while (begin < end) {
swap(array, begin++, end--);
}
}
```
调用 `permutation("abc")` 可以得到输出:
```
abc
acb
bac
bca
cab
cba
```
阅读全文