字符串数组元素排列与组合的Java递归实现

排列与组合的Java递归实现 (参考)

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子:

(1)关于字符串排列的问题

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。

可以这样想:固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。这样写成递归程序如下:

 1 package com.meession.weekWork;
 2 import java.util.Scanner;
 3 public class OutputStringAllConbinations {
 4     public static void permutateSequence(char[] strArrs,int i){
 5         char temp;
 6         if(strArrs==null||i>strArrs.length||i<0){
 7             return;
 8         }
 9         else if(i==strArrs.length){
10             System.out.println(strArrs);
11         }
12         else{
13             for(int j=i;j<strArrs.length;j++){
14                 temp = strArrs[j];//交换前缀与当前的字符
15                 strArrs[j] = strArrs[i];
16                 strArrs[i] = temp;
17                 permutateSequence(strArrs, i+1);
18                 temp = strArrs[j];
19                 strArrs[j] = strArrs[i];
20                 strArrs[i] = temp;
21             }
22         }
23     }
24     public static void main(String[] args) {
25         Scanner in = new Scanner(System.in);
26         String str = in.nextLine();
27         char strArrs[] = str.toCharArray();
28         permutateSequence(strArrs, 0);
29     }
30 }

(2)关于组合的问题

输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。

假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中 去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选择m个字符。这两种 选择都很容易用递归实现。

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 import java.util.Queue;
 4 public class Combination {
 5     public static void combiantion(char chs[]){
 6         if(chs==null||chs.length==0){
 7             return ;
 8         }
 9         List<Character> list=new ArrayList();
10         for(int i=1;i<=chs.length;i++){
11             combine(chs,0,i,list);
12         }
13     }
14     //从字符数组中第begin个字符开始挑选number个字符加入list中
15     public static void combine(char []cs,int begin,int number,List<Character> list){
16         if(number==0){
17             System.out.println(list.toString());
18             return ;
19         }
20         if(begin==cs.length){
21             return;
22         }
23         list.add(cs[begin]);
24         combine(cs,begin+1,number-1,list);
25         list.remove((Character)cs[begin]);
26         combine(cs,begin+1,number,list);
27     }
28     public static void main(String args[]){
29         char chs[]={‘a‘,‘b‘,‘c‘};
30         combiantion(chs);
31     }
32 }  
时间: 2024-10-08 06:50:42

字符串数组元素排列与组合的Java递归实现的相关文章

字符串数组全排列——逐个追加组合算法

我们在笔试面试过程中经常会遇到关于排列与组合的问题,其实这些可以通过递归简单的实现,看下面两个例子: (1)关于字符串排列的问题 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 可以这样想:固定第一个字符a,求后面两个字符bc的排列.当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac;接着我们固定第一个字符b,求后面两个字符ac的排列.现在是把c放到第一位

求字符串中元素的所有组合

我们知道具有N个元素的数字进行组合,总共有2^N种情况.那么,如何用程序实现输出这些组合呢???这个问题似乎比 求N个元素进行全排列 的问题要复杂一些,大家可以动脑想一下或者动手去写写程序,那么该采取什么样的思路才是简单的呢??? 常规的思路我们会想到使用循环或者递归,但是实际动手操作起来非常复杂,经常会把自己绕晕,或者很难看懂别人写的程序.下面介绍一种使用不同思路实现的方法,简单有效: 首先,把字符数组每一个元素用一个二进位表示,例如: A B C D E 1 1 1 1 1 ---> 于是它

1008. 数组元素循环右移问题 (20) Java

自己写的时候完全没有想到怎么减少移动的次数,从网上查发现一种自己完全没有想到的取巧的方法,和 没想到的 减少移动次数的方法. 取巧 不用对数组进行移动 ,直接输出: 位移是 把1234 首尾两两换位 成4321,56换成 65,再把432165两两换位 正好是 561234,这是怎么想到的呢 还有一点就是 如果数组长度是5 ,位移为6,那么和位移1的结果是一样的,所以用数组长度%移位的位数 代码: 题目: 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(

Java 带分隔字符串、字符串数组和 ArrayList&lt;String&gt; 之间的转换

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 一.先来认识一下标题说的这三件东西,也许描述的不清楚,但有了下面的例子,就不会有歧义了 1.带分隔字符串是这样的: String seperate

Java比较两个String字符串数组

比较两个String字符串数组元素差异 1.工具类 package io.renren.common.utils; import org.apache.commons.lang3.ArrayUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @program: ivvdata-security * @description:

二维数组 字符串数组

字符串数组元素访问:? 1.访问某个字符串:数组名[第?一维下标]? 2.访问某个字符 :数组名[第?一维下标][第?二维下标] 3.多维数组占?用内存 = 元素个数 乘以 单个元素所占空间 创建?一个字符串数组(内容是你周围?一圈?人的姓名),对字符串 (英?文)从?小到?大排序. char name[3][20] = {"chexianpeng" , "liuhuaixuan" , "liyunxiao"}; for (int j = 0;

.net字符串数组查找方式效率比较

下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB", "CCCC", "DDDD", "EEEEEE", "ffffff", "ggggggg", "hhhhhh", "iii", "", &

【找数组元素最大值的十四种方法】for【练习知识点和总结】

以下是心血成果,版权所有,未经允许,不得转载.作者:李金涛:FROM:光环国际 AT:201712172024.(方便以后,再次修改) <script> // 比较数组中数值的大小是比较常见的操作,比较大小的方法有多种,下面来介绍如下十四种方法,原理代码如下: // 1,排序取值:sort比较器排序(常用),以及冒泡排序(不常用,但方法思想很重要);// 2,假设比较取大值:假设max=arr[0];index=0; 在循环往后比较,如果有比max大的数就让max记录下大的数,索引赋给inde

PHP implode() 函数 把数组元素组合为字符串

http://www.w3school.com.cn/php/func_string_implode.asp PHP implode() 函数 PHP String 函数 实例 把数组元素组合为字符串: <?php $arr = array('Hello','World!','I','love','Shanghai!'); echo implode(" ",$arr); ?> 运行实例 第一个参数为可选项,所以也可以这样调用. echo implode("&quo