利用递归解决全排列问题
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,然后再来找剩下字符串的全排列,这时我们又可以把剩下的字符串分为前缀+字符串的形式,依次类推,直到子字符串只有一个元素,那么这个前缀加上这个子字符串就是原字符串的其中一个全排列。代码如下:
拿字符串举例,就是找出这个字符串的所有元素组成的所有不同的序列,注意,这些序列具有唯一性,所以就要仔细考虑字符串存在相同元素的情况。
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; } }
相关文章推荐
- 利用递归解决全排列问题
- 利用递归解决汉诺塔问题
- 递归解决全排列问题
- Java基于递归解决全排列问题算法示例
- java使用递归解决全排列问题
- c/c++ 斐波那契数列 利用模板元解决递归慢的问题
- 利用递归思想解决问题
- java利用递归解决八皇后问题
- 递归解决输出一个字符串的全排列问题(缺陷:没有考虑字符串中字符重复的问题)
- 递归解决全排列问题+详细图解递归执行
- Java递归解决全排列问题
- 递归分治解决全排列问题
- 利用java中for循环,递归解决机选双色球问题
- 利用递归解决进制转换问题
- 利用递归下降分析解决表达式求值问题之noj35
- 利用递归思想解决问题
- 字符串全排列问题(递归解决有重复字符问题)
- 利用递归解决一些问题
- 利用递归解决汉诺塔问题