题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
分析
第一步:固定第一个字符,然后将其与后面的所有字符交换;
第二步:固定第二个字符,然后将其与后面的所有字符交换;
。。。
第n-1步:固定第n-1个字符,然后将其与后面的所有字符交换;
很明显这个一个递归的过程,构造一个递归函数进行实现。
注意:每一个交换字符后都要交换回来,以便下次再进行交换,过程如图
实现代码如下:
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<>();
if (str != null && str.length() > 0) {
PermutationHelp(str.toCharArray(), 0, res);
Collections.sort(res);//调整输出顺序
}
return res;
}
public void PermutationHelp(char[] chars, int pos, ArrayList<String> list) {
if (pos == chars.length - 1) {
String val = String.valueOf(chars);//字符数组转成字符串
//不能完全相同的又添加一遍
if (!list.contains(val))
list.add(val);
} else {
for (int i = pos; i < chars.length; i++) {
swap(chars, pos, i);
PermutationHelp(chars, pos+1, list);
swap(chars, pos, i);
}
}
}
public void swap(char[] chars, int i, int j) {
char temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
}