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

递归 字符串的全排列

 
阅读更多
package endual;

public class AnagramApp {

	static int size ;
	static int count ;
	static char[] arrChar ;

	public static void main(String[] args) {

		String msgs = "abc" ;
		arrChar = msgs.toCharArray() ;
		size = arrChar.length ;
		count = 0 ;

		doAnagrm(size) ;
	}
	
	/**
	 * 求出一个word的全排列
	 * @param newSize
	 */
	public static void doAnagrm(int newSize) { //传入的是字符数组的长度
		
		
		if (newSize == 1) {
			return ;
		}
		
		for (int j=0; j<newSize; j++) { //对数组进行循环确保每个都能当头头轮的到
			
			doAnagrm(newSize-1) ;
			if(newSize == 2) {
			    displayWord() ;
			}
			rotate(newSize) ; //进行调换位子
		}
	}


	//循环左边所有的字符从这个位子到结束
	private static void rotate(int newSize) {
		// TODO Auto-generated method stub
		
		int j ;
		int position = size - newSize ; //总的长度 - 当前字符的长度就是当前位子
		                                //"abcde"---5个 当前位子0 -- a
		                                //"bcde" ---4个当前位子1 -- b
		char temp = arrChar[position]; //保存第一个字母
		for (j=position+1; j < size; j++) { //从当前位子的下一个位子开始
			//移动位子// 原来的是  []bcde --- []cde[空的位子]
			arrChar[j-1] = arrChar[j] ;
		}//跳出循环以后,j的大小是size的大小
		
		arrChar[size-1] = temp ; //将[空的位子] 用temp来代替了
	} // end


	//打印单词
	private static void displayWord() {
		// TODO Auto-generated method stub
		
		if(count < 99) {
			System.out.print(" ") ;
		}
		if (count < 9) {
			System.out.print(" ") ;
		}
		System.out.print(++count + " ") ;
		for (int i=0; i < size; i++) {
			System.out.println(arrChar[i]) ;
		}//打印数列		
		System.out.println("   ");
		System.out.flush() ;
		if(count%6 == 0) {
			System.out.println(" ");
		}
	}
}

 

这是递归应用的另外一种情况。
在这种情况下递归提供了一种对问题的简单简洁的解决方法。排列是指按照一定的顺序安排事物。
假设想要列出一个指定的单词的所以变位子,也就是列出该词的全排列(不管这些排列是否是真的英语单词),
他们都是由原来这个单词的字母组成的。我们称这一的工作是变位一个单词或者称为全排列一个单词。

分享到:
评论

相关推荐

    求字符串的全排列

    这段代码展示了如何使用递归和回溯算法解决字符串全排列问题。对于较长的字符串,这种方法可能会效率较低,因为它会生成大量重复的排列。在实际应用中,可以考虑使用其他算法,如记忆化搜索或字典树等,以提高效率。...

    带油重复字符串全排列递归解法

    常见得全排列有三种解决方案,for循环穷举,stl摸板函数next_permutation,还有DFS深度优先搜索,当我们遇到带有重复的字符串时应该考虑除去重复的部分。

    使用C语言解决字符串全排列问题

    输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba 思路 这是典型的递归求解问题,递归算法有四个特性: 必须有可...

    Java实现字符数组全排列的方法

    全排列是指从给定的字符数组中,按照一定的顺序生成所有可能的排列组合。这个问题通常使用回溯法来解决,因为它能够有效地避免重复的排列。下面我们将深入探讨如何使用Java实现字符数组的全排列。 首先,我们需要...

    Java递归实现字符串全排列与全组合

    "Java递归实现字符串全排列与全组合" Java递归实现字符串全排列与全组合是指使用Java语言通过递归算法实现字符串的全排列和全组合。全排列是指将字符串中的所有元素按照一定的顺序进行排列,而全组合是指将字符串...

    PHP实现字符串的全排列详解

    全排列是一种对给定序列进行不重复的元素重排的算法。在PHP中实现字符串的全排列,可以通过递归和回溯法来完成。递归是函数自我调用的一...对于PHP中的字符串全排列来说,掌握这些知识点,可以有效解决相关的编程难题。

    生成字符串的全排列,可以用回溯法实现

    总的来说,通过回溯法实现字符串全排列是一个经典的计算机科学问题,涉及到递归、搜索和问题解决策略。同时,DHTML和JavaScript是Web开发的重要组成部分,它们与算法学习相结合,可以帮助开发者提高综合技能。

    Python字符串的全排列算法实例详解

    ### Python字符串的全排列算法实例详解 #### 一、引言 在计算机科学中,全排列问题是一个常见的问题,尤其在解决密码学、组合优化等领域时尤为重要。全排列指的是从给定的一些元素中取出全部元素进行排列的方式。...

    java实现字符串的全排列

    在java中,实现字符串的全排列可以使用递归思想。将需要全排列的字符串分为两部分:第一个字符和第一个字符后面的所有字符。然后,对第一个字符和后面的字符进行交换,固定第一个字符,对后面的字符进行全排列。这样...

    C++字符串的全部排列

    在这个问题中,我们需要对给定的字符串中的每个字符进行全排列。 首先,我们来理解字符串的基本概念。在C++中,字符串是由字符组成的序列,可以使用`std::string`类来表示。字符串可以被初始化、操作、比较和拷贝,...

    输出n个字符的全排列(没有重复字符)

    简单的实现,代码很短。...输入一个字符串,输出它的字符的所有组合的情况 如输入“abc”,则输出abc,acb,bac,bca,cab,cba。 但如果输入“aba”,即有重复的,也会输出aba,aab,baa,baa,aba,aab。

    字符串的全排列和组合算法.doc

    字符串的全排列和组合算法是计算机科学中的一种基础算法,主要应用于数据处理和问题求解。在本文档中,我们将探讨如何使用C++实现字符串的全排列算法,并讨论如何处理包含重复字符的情况。 首先,全排列是指从一个...

    使用swap求解不重复字符串的全排列

    为方便起见,用123来示例下。123的全排列有123、132、213、231、312、321这六种。首先考虑213和321这二个数是如何得出的。显然这二个都是123中的1与后面两数交换得到的...找到这个规律后,递归的代码就很容易写出来了:

    数据结构和算法:字符串

    针对字符串全排列问题,当字符有重复时,需要特别处理以去除重复排列。这可以通过交换字符时进行检查,确保交换前后不产生重复排列来实现。如果字符集合较大,可能需要采用额外的空间来标记哪些字符已被使用,以此来...

    js实现字符全排列算法的简单方法

    如果需要处理大字符串的全排列问题,可能会考虑使用非递归的实现方式,或者利用其他高级数据结构和算法来优化性能。例如,可以使用回溯算法(backtracking algorithm)来避免生成重复的排列,或者使用迭代方式来控制...

    输入一个字符串,输出所有该字符串的组合情况

    - `TestPermute.java`:可能实现了字符串的全排列算法,并命名为`permute`方法。 - `Test2.java`:可能是对另一种算法的实现,比如改进或优化过的版本。 - `Test.java`:通常用于编写单元测试,检验各种输入情况下,...

Global site tag (gtag.js) - Google Analytics