排列组合问题

排列组合问题

请问如何使用Java编程将“慕课网程序员的梦工厂”这几个字进行不同的排列组合,老师可以代码实现一下吗?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,在第一次执行后,s.length() == 0打印出结果后,执行完成printAllArray(s.substring(1), n + s.charAt(0));后,返回方法调用处,会继续使用main方法传入的s变量,所以继续执行s = s.substring(1) + s.charAt(0);的代码,也就是使字符串平移一位。

具体如下:

http://img1.sycdn.imooc.com//climg/5da03be1097266fa06260241.jpg

同学可以尝试,使用debug打入断点的方式,跟踪一下代码的执行情况,会更加清楚的明白哦~

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕酷酷 2019-10-10 17:57:28

同学你好,由于代码的实现有很多思路,这里老师只是简单提供一个思路:

因为本题目会涉及到算法:递归算法,所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解方式。

递归是需要结束条件的,要不然就是无尽的循环了,在下面的段代码中, if (s.length() == 0) 即当传递的参数s长度为0时结束递归。

printAllArray(s.substring(1), n + s.charAt(0));调用方法接收的参数为字符串s和n,每次在方法内部调用自身,即一个递归调用,参数为s.substring(1)和 n + s.charAt(0));   每次调用的参数都会是参数s的长度减少1,而n增加1,直到结束条件s.length() == 0为真,递归结束,打印一个结果。
递归会进行s.length()次,而且函数调用自身的地方位于循环 for (int i = 0; i < s.length(); ++i) 中,所以会打印出s.length()次结果

s = s.substring(1) + s.charAt(0); 它的作用是使字符串平移一位,如s为"1234",执行此句后就变为了"2341",保证每次产生不重复的结果。

由于“慕课网程序员的梦工厂”字数较多,排列组合次数过多,这里老师以“慕课网”三个字为例:

具体代码如下:

public class Test {
	static int c = 0;

	public static void main(String[] args) {
		String s = "慕课网";
		printAllArray(s);
	}

	private static void printAllArray(String s) {
		printAllArray(s, "");
	}

	private static void printAllArray(String s, String n) {
		if (s.length() == 0) {
			System.out.println(n + "  ---  " + ++c);
		} else {
			for (int i = 0; i < s.length(); ++i) {
				printAllArray(s.substring(1), n + s.charAt(0));
				s = s.substring(1) + s.charAt(0);
			}
		}
	}
}

由于并不是课程中的内容,同学还需要自行理解哦~

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 小武鸣 #1
    第一次执行后,s.length() == 0打印出结果后,里面的s应该是空的啊,那么s.substring(1) + s.charAt(0)应该没有东西的啊,为什么还能交换次序,这里我不太明白,希望老师讲解一下
    2019-10-11 14:08:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师