您的位置:首页 > 其它

利用递归解决全排列问题

2016-08-10 14:34 281 查看
什么是排列?一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列。特别地,当m=n时,这个排列被称作全排列。

拿字符串举例,就是找出这个字符串的所有元素组成的所有不同的序列,注意,这些序列具有唯一性,所以就要仔细考虑字符串存在相同元素的情况。

abc这样的一个字符串,它的全排列就有:abc、acb、bac、bca、cba、cab

不妨把abc分成两部分——前缀+子字符串,可以得到整个字符串的全排列=前缀+子字符串的全排列,首先将所有元素依次放到第一个元素,将其作为前缀,如axx,bxx,cxx,然后再来找剩下字符串的全排列,这时我们又可以把剩下的字符串分为前缀+字符串的形式,依次类推,直到子字符串只有一个元素,那么这个前缀加上这个子字符串就是原字符串的其中一个全排列。代码如下:

import java.util.ArrayList;
import java.util.TreeSet;

public class Solution {
public ArrayList<String> Permutation(String str) {
if(str.length()==0){
return new ArrayList<String>();
}
ArrayList<String> list = new ArrayList<String>();
TreeSet<String> set = new TreeSet<String>();
char[] charArray = str.toCharArray();

Array(set, charArray, 0, charArray.length-1);
for(String string:set){
list.add(string);
}
return list;
}

public void Array(TreeSet<String> set, char[] charArray, int beginIndex, int endIndex){
if(beginIndex==endIndex){
String result = new String(charArray);
set.add(result);
return;
}else{
for(int i=beginIndex;i<=endIndex;i++){
swap(charArray, beginIndex, i);
Array(set, charArray, beginIndex+1, endIndex);
swap(charArray, beginIndex, i);
}
}

}

public void swap(char[] charArray, int first, int second){
char temp = charArray[first];
charArray[first] = charArray[second];
charArray[second] = temp;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: