标签:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。
例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
把一个字符串看成两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。求整个字符串的排列,分为两步:
第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换
第二步:固定第一个字符,求后面所有字符的排列,这个时候扔把后面的所有字符看成两个部分:后面字符的第一个字符,以及这个字符之后的所有字符,这是一个递归的过程。
核心程序
for(int i = start;i<chars.length;i++){
// 交换
swap(chars,start,i);
// 递归
Permutation(chars,start+1,set);
// 换回去
swap(chars,start,i);
}
从start位置开始与后面(包括start)的所有位置互换
互换后进行递归,注意递归的起始位置是start+1,而不是i+1,下次递归是下一个位置和后面的所有位置进行互换。
最后要回溯,换回去
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result = new ArrayList<String>();
if(str == null || str.length()==0){
return result;
}
Set<String> set = new TreeSet<String>();
char array[] = str.toCharArray();
Permutation(array,0,set);
result.addAll(set);
return result;
}
public void Permutation(char[] chars,int start,Set<String> set){
if(start == chars.length -1 ){
String p = String.valueOf(chars);
set.add(p);
return;
}
for(int i = start;i<chars.length;i++){
// 交换
swap(chars,start,i);
// 递归
Permutation(chars,start+1,set);
// 换回去
swap(chars,start,i);
}
}
public void swap(char[] array,int i,int j){
char tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
标签:
原文地址:http://blog.csdn.net/qunxingvip/article/details/51735720