递归 字符串的全排列

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(" ");
		}
	}
}

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值