题目描述:给你个字符串,将其字符按照字典顺序排列,输出所有可能的结果
思路:排列组合问题,用回溯法
1,找出选择,简单的排列组合,相当于一群人握手,每个人都要与其他人握一次手,总共要n!次
n 到 n-1 到n-2 ... 2到1,这是一个递归迭代的过程,用for循环遍历当前未被选择的字符
2,条件,若当前还有未被选择的字符,那么就继续for循环
3,结束,若没有了,则将当前字符串添加进结果中
java程序:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Solution {
public ArrayList<String> Permutation(String str) {
List<String> res = new ArrayList<String>();
if(str!=null){
f(res,str.toCharArray(),0);
Collections.sort(res); //按照字典顺序排序
}
return (ArrayList)res;
}
public void f(List<String> list,char[] arr,int k){
//判断是否到达结束,
if(k==arr.length-1){
String a = String.valueOf(arr); //当前字符串
if(!list.contains(a)){
list.add(a); //加入到结果中
}
}
//循环寻找当前层的所有未使用的字符
for(int i = k;i<arr.length;i++){
swap(arr,i,k); //交换位置,相当于一种可能
f(list,arr,k+1); //递归,在之前交换位置的情况下,剩下的所有可能
swap(arr,i,k); //之前位置的情况都遍历完了,需要将位置变回来,好让下一个当前层未使用的字符交换,不出现重复
}
}
public void swap(char[] arr,int i, int k){
char tmp = arr[i];
arr[i]= arr[k];
arr[k]= tmp;
}
}