`
wangmengjun
  • 浏览: 6058 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

全排列递归实现

阅读更多

全排列是一种比较常用的算法。本文给出一个全排列的递归实现方法。

 

首先,我们一起来一下有什么规律可循。

 

1. 如果待处理的字符串的长度为1,则直接输出即可。

2. 如果待处理的字符串的长度为2,则有两种情况:

 

    假设字符串为“AB”, 那么直接输出AB 和BA即可。

 

3. 如果待处理的字符串长度大于2,那么调用递归方法实现。

 

思想 ==> 在处理递归方法的时候,考虑两个值,一个是固定的前缀值,另一个是剩余的用于全排列的字符。当剩余的用于全排列的字符串长度为2个或者1个只有当用于全排列的字符串的长度为1,也即只有一个字符的时候才发生),直接输出结果,格式为固定的前缀+剩余字符的全排列

 

有了上述的基本思想,我们就可以很容易写出代码来了,代码如下:

 

/**
 * @author wangmengjun
 *
 */
public class Permutation {

	/**
	 * 根据指定的字符串,输入全排列
	 * 
	 * @param value
	 *            用于全排列的指定字符串
	 */
	public void permutation(String value) {
		if (null == value || value.length() == 0) {
			throw new IllegalArgumentException("value不能为空");
		}
		permutationResc("", value);
	}

	/**
	 * 递归处理
	 * 
	 * @param prefix 固定前缀
	 * @param valueToProcess 待处理的字符串
	 */
	private void permutationResc(String prefix, String valueToProcess) {
		int len = valueToProcess.length();
		if (len == 1) {
			System.out.println(prefix + valueToProcess);
		} else if (len == 2) {
			/**
			 * 如果待处理的字符串只有2个字符了,那么直接输出这两种情况 System.out.println(prefix
			 * +valueToProcess); 等价于
			 * System.out.println(prefix+valueToProcess.charAt(0) +
			 * valueToProcess.charAt(1));
			 */
			System.out.println(prefix + valueToProcess);
			System.out.println(prefix + valueToProcess.charAt(1)
					+ valueToProcess.charAt(0));
		} else {
			for (int i = 0; i < len; i++)
				permutationResc(
						prefix + valueToProcess.charAt(i),
						valueToProcess.substring(0, i)
								+ valueToProcess.substring(i + 1, len));
		}
	}
}

 

 

public class Main {

	public static void main(String[] args) {
		
		Permutation example = new Permutation();
		
		example.permutation("A");
		System.out.println();
		
		example.permutation("AB");
		System.out.println();
		
		example.permutation("ABC");
		System.out.println();
		
		example.permutation("ABCD");
	}
}
 

 

输出结果:

 

 

A

AB
BA

ABC
ACB
BAC
BCA
CAB
CBA

ABCD
ABDC
ACBD
ACDB
ADBC
ADCB
BACD
BADC
BCAD
BCDA
BDAC
BDCA
CABD
CADB
CBAD
CBDA
CDAB
CDBA
DABC
DACB
DBAC
DBCA
DCAB
DCBA
 
上述的程序适合字符串中无重复的字符如果有相同的字符,那么就会产生重复结果

如果需要输出无重复的结果集合,需要再添加重复验证,最简单的就是将每个结果放在Set中去重。

分享到:
评论

相关推荐

    去重全排列的递归实现

    去重全排列的递归实现 去掉重复数字的 全排列的 递归实现

    JAVA递归实现全排列

    JAVA递归实现全排列算法,含实现源代码,如a、b、c、d的全排列为: abcd abdc acbd acdb adcb adbc bacd badc bcad bcda bdca bdac cbad cbda cabd cadb cdab cdba dbca dbac dcba dcab dacb dabc

    全排列递归算法的并行化.pdf

    Multiple Data)2CREW(Contiguous Resources with Exclusive Write)模型和SIMD(Single Instruction, Multiple Data)EREW(Elementary Operation with Register Write)模型上的全排列递归算法的并行化实现。...

    全排列——递归排序和字典序列

    本文将详细介绍两种实现全排列的方法:递归排列和字典序排列,并通过具体的代码示例来加深理解。 #### 一、递归排列 递归排列是一种直观且易于实现的方法。其基本思路是从集合中依次选取每一个元素作为排列的第一...

    递归实现元素全排列.html

    递归实现元素全排列

    递归练习 数据结构实验全排列

    下面是一个简单的全排列递归算法实现(用伪代码表示): ```python function permute(data, start, end): if start == end: // 基本情况:只有一个元素 print(data) else: for i in range(start, end + 1): // ...

    全排列的非递归实现JAVA

    全排列的非递归实现。 输入1,2,3,4 得到 [1 2 3 4]..........[4 3 2 1]所有24种排列

    全排列-基于递归实现-permutation.cpp

    全排列-基于递归实现

    不得不说的全排列算法递归实现

    本文将详细介绍全排列算法的递归实现,以帮助读者理解全排列算法的工作原理及其在递归上的应用。 全排列问题可以简单地表述为:给定一个非空的数字集合,要求出这个集合的所有排列。例如,对于集合{1, 2, 3},它的...

    php全排列递归算法代码

    通过以上两种实现方式,我们不仅可以理解全排列递归算法的基本原理,还可以了解到如何在实际应用中解决可能出现的问题。在处理包含重复元素的数据集时,第二种实现方式显得尤为重要。此外,这种算法不仅适用于PHP,...

    C#算法之全排列递归算法实例讲解

    全排列递归算法的实现通常基于以下策略: 1. 基线条件:当只剩下一个元素时,输出当前排列。 2. 递归步骤:对每个位置,尝试将所有未使用的元素放置在该位置,然后递归地对剩余元素执行全排列。 在C++代码示例中,...

    java递归实现N个数全排列输出

    在这个场景中,我们将探讨如何使用Java语言,通过回溯法来递归实现全排列的输出。 首先,我们需要理解回溯法的基本概念。回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,并在每一步中检查当前的解...

    全排列-非递归算法

    在本例中,我们关注的是非递归算法来实现全排列,这通常使用回溯法或者迭代的方式来完成,特别是在有新元素动态加入时,需要能够快速适应并重新生成全排列。 非递归算法的优点在于它可以避免深度过大的调用栈,从而...

    递归实现元素全排列2.html

    递归实现元素全排列

    python递归全排列实现方法

    本篇将重点介绍如何使用Python通过递归的方式来实现全排列。 首先,我们要理解递归的概念。递归是一种编程方法,它通过调用自身来解决问题或执行任务。在全排列问题中,我们可以将全排列视为一个由较小规模的子问题...

    C语言全排列的递归算法

    全排列递归算法的核心思想是基于递归函数,它通过不断地将当前元素与剩余未排列的元素进行交换来生成所有可能的排列。下面是一个简化的C语言实现全排列的递归算法步骤: 1. **定义递归函数**:首先,我们需要定义一...

    非递归对输入的数字进行全排列_C语言实现

    上传之后才发现头文件少了个ctype.h,因为判断非法输入的时候用到了isalpha(),不加这个头文件的话在gcc下会有警告,在VC下可能编译不过! 首先把输入的各个数由小到大进行排序,然后开始 1.找出比右边数字小的第一...

    全排列C++实现

    全排列递归通常基于回溯思想,即在当前选择的基础上尝试所有可能的选择,如果某个选择不满足条件,则退回一步,尝试其他选择。在C++中,递归函数可以这样设计: ```cpp void permute(vector&lt;int&gt;& nums, int start)...

    全排列递归算法的并行化 (2007年)

    尽管全排列递归算法在结构上清晰且易于理解,但它的效率并不高,因为其执行效率较低,计算时间和存储空间的开销都较大。为了提升效率,研究人员提出了在多指令多数据流(MIMD)和单指令多数据流(EREW)模型上的并行...

Global site tag (gtag.js) - Google Analytics