目录
题目描述
输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串 abc,则打印出由字符 a, b, c 所能排列出来的所有字符串 abc, acb, bac, bca, cab 和 cba。
测试用例
- 功能测试(输入的字符串中有一个或者多个字符)
- 特殊输入测试(输入的字符串的内容为空或者空指针)
题目考点
- 考察应聘者的思维能力。
- 考察应聘者对递归的理解和编程能力。
解题思路
通过将字符串分成两部分,从而把大问题分解成小问题,然后使用递归解决。
- 求所有可能出现在第一位置的字符,即把第一个字符和后面所有的字符交换。(记得为了下一次的交换,要把之前交换的东西交换回来)
- 固定第一个字符,求后面所有字符的排列。
- 这时候我们仍把后面的所有字符分成两个部分:后面字符的第一个字符,以及这个字符之后的所有字符。重复过程1,2。
自己解题
找到一个,回溯法(改日再来备注)
import java.util.List;
import java.util.Collections;
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) {
Solution p = new Solution();
System.out.println(p.Permutation("abc").toString());
}
public ArrayList<String> Permutation(String str) {
List<String> res = new ArrayList<>();
if (str != null && str.length() > 0) {
PermutationHelper(str.toCharArray(), 0, res);
Collections.sort(res);
}
return (ArrayList)res;
}
public void PermutationHelper(char[] cs, int i, List<String> list) {
if (i == cs.length - 1) {
String val = String.valueOf(cs);
if (!list.contains(val))
list.add(val);
} else {
for (int j = i; j < cs.length; j++) {
swap(cs, i, j);
PermutationHelper(cs, i+1, list);
swap(cs, i, j);
}
}
}
public void swap(char[] cs, int i, int j) {
char temp = cs[i];
cs[i] = cs[j];
cs[j] = temp;
}
}
参考解题
import java.util.ArrayList;
import java.util.TreeSet;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<String>();
if(str == null || str.length() == 0){
return result;
}
char[] ca = str.toCharArray();
TreeSet<String> temp = new TreeSet<>();
// 调用,这一部分没怎么看懂,addALL的作用是啥???
PermutationCore(ca,0, temp);
result.addAll(temp);
return result;
}
//------------- 功能函数--------------------
void PermutationCore(char[] ca, int begin, TreeSet<String> result){
//
if(begin == ca.length){
//valueOf(char[] data)
//返回 char数组参数的字符串 char形式。
result.add(String.valueOf(ca));
}else{
for(int i = begin; i < ca.length; ++i){
// 和后面一个字符交换位置
swap(ca, i, begin);
PermutationCore(ca, begin+1, result);
// 换回来,为了下一次交换
swap(ca, i, begin);
}
}
}
void swap(char[] ca, int i, int j){
char temp = ca[i];
ca[i] = ca[j];
ca[j] = temp;
}
}
扩展