给定一系列数字,请打印出这些数字的所有排列,例如1,2,2,3,4,请列出所有的排列

来源:互联网 发布:centos pptp 客户端 编辑:程序博客网 时间:2024/06/05 23:50

今天看书,看到了一道题目,就是:

给定一系列数字,例如1,2,2,3,4,请列出这系列数字的所有排列。


这道题目实际上很有意思,因为如果给出这样的一系列的数字1,2,3,4,就是各个数字都不一样,这样的排列就很好列出了,我们可以逐个遍历,我们可以从简单的算起,首先我们列出具有不同的字符序列的所有排列

1、开始的时候,是这样1234,先将1固定住,则后面的234在代入进去,称为一个新的字符串参加递归,则得到的就是以1开头的所有排列的字符串

2、同样的234,现将2固定住,则后面的34作为一个新的字符串参加递归,则得到以12开头的所有排列的字符串1234    1243

3、对于34,将3固定住,则只有34一种排列。

上面的以1 为前缀的知识排列的一种,接下来

4、如下面的程序我们可以看出    body = body.substring(1) + body.substring(0, 1);

则是将1234编程2341,重新进行递归,则此时就是将2作为前缀继续递归,则能求出以2 为前缀的所有排列

5、下面分别对3    4 作为前缀继续递归,则能求出所有的排列。

因为递归的此数就是body字符串的长度,所以我们刚好可以将所有的字符串放在首位作为前缀递归。

下面是具有不同的字符序列的所有排列的源代码:

package programmer;public class PreKinds {public static int count = 0;public void preKinds(String body, String prefix) {if (body.length() < 1) {System.out.println(prefix);count++;} else {// int[] index = new int[body.length()];// for (int i = 0; i < body.length(); i++)// index[i] = body.indexOf(body.charAt(i));for (int i = 0; i < body.length(); i++) {// if (i == index[i])preKinds(body.substring(1), prefix + body.substring(0, 1));   //这儿就是实现将前缀先固定住的方法body = body.substring(1) + body.substring(0, 1);//这儿可以实现将2、3、4分别放在最前面作为前缀的一部分}}}public static void main(String[] args) {String body = "1234";new PreKinds().preKinds(body, "");System.out.println(count);}}



通过上面的讲解,我们已经明白了具有不同的字符序列的所有排列,但是我们现在所要求的是中间可能还有相同的字符,这个题目很巧妙,因为它要关注字符本身,是1,2,2,3,4,我们发现,要排列的字符总是顺序的,即是有序的,这就让我想到我们如果要使具有相同字符序列的排列只可以有一次递归,千万不能出现两次递归,我们可以用一个数组来标记相同字符出现的最初位置,就可以方便判断了。

下面是具有相同的字符序列的所有排列的源代码:

package programmer;public class PreKinds {public static int count = 0;public void preKinds(String body, String prefix) {if (body.length() < 1) {System.out.println(prefix);count++;} else {int[] index = new int[body.length()];for (int i = 0; i < body.length(); i++)index[i] = body.indexOf(body.charAt(i));  //这里将每个字符第一次出现的位置放在index数组中for (int i = 0; i < body.length(); i++) {if (i == index[i])   //判断,如果有相同的字符,则index[i]与i一定不相等preKinds(body.substring(1), prefix + body.substring(0, 1));body = body.substring(1) + body.substring(0, 1);}}}public static void main(String[] args) {String body = "12234";new PreKinds().preKinds(body, "");System.out.println(count);}}


希望大家多多指正。

0 0
原创粉丝点击