/**
* 全排列,没有重复元素
* @author gche
* 思想:如求abc的全排列,可先求bc的全排列,bc,cb,然后分别和a进行组合成结果:abc,bac,bca,acb,cab,cba
*/
public class Arrange {
@Test
public void test(){
String data = "abc";
List<String> ret = this.arrange(data);
System.out.println(ret.size() == size(data.length()));
System.out.println(ret);
Set<String> set = new HashSet<String>(ret);
System.out.println(ret.size() == set.size());
}
/**
* 全排列
* @param str
* @return
*/
private List<String> arrange(String str){
if(StringUtils.isEmpty(str)){
return Collections.emptyList();
}
if(str.length() <= 1){
return Arrays.asList(str);
}
//第一个字母和剩下字母的全排列组合
return joint(str.charAt(0), arrange(str.substring(1)));
}
/**
* 组合。即<b>ch</b>插入到<b>arrs</b>
*
* @param ch
* @param arrs
* @return
*/
private List<String> joint(char ch, List<String> arrs){
List<String> ret = new ArrayList<String>((arrs.get(0).length()+1) * arrs.size());
for(int i=0; i<arrs.size(); i++){
String arr = arrs.get(i);
for(int j=0; j<arr.length(); j++){
ret.add(arr.substring(0, j) + ch + arr.substring(j));
}
ret.add(arr + ch);//last position
}
return ret;
}
/**
* 全排列的个数,验证
* @param i
* @return
*/
private int size(int i){
if(i <= 1){
return 1;
}
return i * size(--i);
}
}
分享到:
相关推荐
在Java编程中,全排列是一个常见的问题,它涉及到算法和数据结构的知识。全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。...
在编程领域,全排列是一个经典的算法问题,它涉及到如何生成一个序列的所有可能排列方式。当输入元素中存在重复时,处理全排列问题会变得更为复杂。C#作为.NET框架下的主要编程语言,提供了丰富的数据结构和算法支持...
在编程领域,全排列是一个经典的算法问题,它涉及到如何生成一组特定数量的元素的所有可能排列。在这个场景中,我们关注的是使用C语言来实现对5个数的全排列。C语言是一种底层、高效的编程语言,适合处理这种计算...
全排列代码,C语言代码,用来解决全排列问题,csc 认证
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为 例说明如何编写全排列的递归算法。 1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列...
123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的。然后可以将123的第二个数和每三个数交换得到132。同理可以根据213和321来...
全排列是一种经典的组合数学问题,它涉及到从n个不同元素中取出n个元素,并按照一定的顺序排列,所有可能的排列组合就是全排列。在计算机科学中,全排列算法经常用于解决各种排列组合的问题,比如测试用例的生成、...
全排列矩阵是数学中的一种重要概念,特别是在组合数学和计算机科学中有着广泛的应用。它指的是一个有限序列的所有可能排列方式组成的矩阵。例如,对于数字序列1, 2, 3,其全排列包括(1, 2, 3), (1, 3, 2), (2, 1, 3)...
全排列是组合数学中的一个重要概念,它涉及到计算机科学中算法设计和分析的范畴,尤其是在解决排列组合问题时。在C/C++编程语言中,实现全排列通常需要借助递归或回溯法。以下是对全排列及其C/C++实现的详细解释。 ...
在这个实验报告中,局部搜索被应用于解决全排列问题,即找到一个给定数量的元素的所有可能排列方式。全排列问题是一个典型的组合问题,具有较高的计算复杂度。 全排列的核心思想是递归。递归是一种函数或程序调用...
全排列是计算机科学和数学中的一个重要概念,指的是从n个不同元素中取出m(m≤n)个元素的所有可能的排序。全排列的数量可以通过排列数公式n!(n的阶乘)来计算。全排列算法广泛应用于程序设计中,尤其是在需要穷举...
CC++全排列算法详解 在计算机科学中,全排列是一个非常重要的概念,它指的是将一个集合中的元素按照一定的顺序排列出来的所有可能的排列方式。在这个文件中,我们将讨论CC++中生成从1到n的全排列算法,以及字符串的...
全排列指的是从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排列起来,所有的排列情况就构成了全排列。 Objective-C实现全排列算法通常基于递归或回溯法。下面,我们将详细探讨如何使用Objective-C实现全排列...
全排列是组合数学中的一个重要概念,它涉及到计算机科学中的算法设计和数据结构。在这个C++程序实验中,我们将深入理解如何生成一个给定整数集合的全排列。这个任务通常用递归或回溯法来解决,对于学习编程和算法...
本文将深入解析一个C++程序示例,该程序旨在生成指定数字集合的所有可能全排列,这对于理解递归算法、数组操作以及逻辑判断等核心编程概念具有重要价值。 ### 全排列的概念 全排列是指从n个不同元素中取出m(m≤n)...
实验题目涉及的是随机全排列的生成程序及其应用开发,这是计算机科学中的一种常见问题,特别是在算法设计、数据处理和模拟实验等场景下。本实验主要提供了两种生成全排列的方法,并结合C语言编写了相应的代码。 **...
自己写的基于字符的全排列算法,代码简洁,高效,7位数的全排列都是秒排!用到了广度优先排列,深度优先搜索和几个递归,唯一没完成的是退出时释放内存,呵呵,破解密码时超有用的哟,,
"算法分析与设计中的全排列问题" 全排列问题是计算机科学中的一种经典问题,即给定n个元素{r1,r2,…,rn},生成所有可能的排列组合。这种问题在很多领域中都有重要应用,如数据结构、算法设计、机器学习等。 在上述...
全排列是一种组合数学中的概念,指的是从n个不同的元素中取出n个元素,按照一定的顺序进行排列,所有可能的排列方式的总数就是全排列的个数。在本例中,我们关注的是如何用编程语言来实现全排列的输出,特别地,使用...