输出n个不同字符的所有排列方式(据说是京东笔试题)

比如:

eg1:

输入ab

输出ab,ba

eg2:

输入abc

输出abc,acb,bac,bca,cab,cba

 

        定义了两个链表,一个存储源字符序列,即eg1中的a跟b,另一个作为栈使用,在每一次递归时往栈里面压一个字符,然后递归出来了就把这个字符退出栈。

递归函数中先判断是否递归到了尽头(就是存放源字符序列的链表已经为空),如果递归到了尽头,则输出栈中的所有字符。如果没有则进入下面的循环:

新建一个源字符序列的备份cpSrc,将第i个字符压栈,将cpSrc中的第i个字符移除,然后将现在的cpSrc作为新的源字符序列,交给函数next进行递归。递归完了回来再把第i个字符退栈。

i=(0,src.size());

代码如下:

public void next(LinkedList<Character> src,LinkedList<Character> head)
	{
		
		if (src==null) return;
		if (head==null) head = new LinkedList<Character>();
		
		if (src.isEmpty())
		{
			System.out.print(head+" ");
		}
		else {
			for(int i=0;i<src.size();i++){
				/* create a copy of the source list to use by the method 
				 * which been called and avoid affecting the next iteration
				 */
				LinkedList<Character> cpSrc=new LinkedList<Character>(src);
				
				head.add(cpSrc.remove(i));
				next(cpSrc,head);
				head.removeLast();
			}
		}
		
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值