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

(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的排列。这样写成递归程序如下:

public class Permutation {  public static void permutation(char[]ss,int i){  if(ss==null||i<0 ||i>ss.length){  return;  }  if(i==ss.length){  System.out.println(new String(ss));  }else{  for(int j=i;j<ss.length;j++){  char temp=ss[j];//交换前缀,使之产生下一个前缀  ss[j]=ss[i];  ss[i]=temp;  permutation(ss,i+1);  temp=ss[j]; //将前缀换回来,继续做上一个的前缀排列.  ss[j]=ss[i];  ss[i]=temp;  }  }  }  public static void main(String args[]){  char []ss={'a','c','b','d'};  permutation(ss,0);  }
} 

(2)关于组合的问题

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

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

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
public class Combination {  public static void combiantion(char chs[]){  if(chs==null||chs.length==0){  return ;  }  List<Character> list=new ArrayList();  for(int i=1;i<=chs.length;i++){  combine(chs,0,i,list);  }  }  //从字符数组中第begin个字符开始挑选number个字符加入list中  public static void combine(char []cs,int begin,int number,List<Character> list){  if(number==0){  System.out.println(list.toString());  return ;  }  if(begin==cs.length){  return;  }  list.add(cs[begin]);  combine(cs,begin+1,number-1,list);  list.remove((Character)cs[begin]);  combine(cs,begin+1,number,list);  }  public static void main(String args[]){  char chs[]={'a','b','c'};  combiantion(chs);  }
}  

转载于:https://www.cnblogs.com/longhs/archive/2013/06/14/3135433.html

排列与组合的Java递归实现 (参考)相关推荐

  1. 排列和组合简单的递归思路以及C++实现

    本文将讲解如何通过递归的方法实现全排列和组合,会详细讲解递归的思路,最后还会给出c++实现的源码.先前学习数据结构和算法的时候一直没有弄明白它们的递归思路,今日遇到,细一思考,发现并没有之前那么难,于 ...

  2. 排列、组合问题(递归)

    这里主要介绍字符串排列组合问题,高中数学常见的题目,不用详细介绍,看例子就可以解决问题 "1212" 全排列结果为 1212,1221,1122,2112,2121,2211 组合 ...

  3. 排列与组合中的递归策略(as3.0)

    section 1. 字符串的全排列.譬如假定给定字符串为"abc",则全排列是"abc"的所有可能组合,且每一个字符都不相关.如"aaa" ...

  4. Java递归求全排列详解

    Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...

  5. java 实现组合_用Java实现排列、组合算法

    组合个数的计算公式如下: 那么,计算排列或组合的数量,通过上面的公式就很容易就算出来了,其Java的实现如下: /** * 计算阶乘数,即n! = n * (n-1) * ... * 2 * 1 * ...

  6. 通用的非递归排列和组合算法[附源码]

    动机 Apache Math包中有很多关分布的算法,但是没有找到排列组合相关的算法.索性自己写一个.排列组合可以分两个算法: 组合算法,就是在一个数组中取出m(小于等于数组的长度 n)个对象,有多少中 ...

  7. 排列组合问题Java实现

    上一篇博客写了怎样实现一个字符串的全排列,并且也给出了代码,在看这篇博客前先将上一篇博客搞懂,这篇看起来就很简单了.这篇将讲解一个从M个数中选取N(N<=M)个数的排列和组合,这里先说明一下,M ...

  8. java排列和组合算法

    package com.louisgeek.price;/*** 排列和组合算法* @author Administrator**/ public class CaseTest {public sta ...

  9. 回溯算法团灭子集、排列、组合问题

    回溯算法团灭子集.排列.组合问题 一.子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] ...

最新文章

  1. innodb 悲观锁 乐观锁_mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁
  2. FPGA内部硬件结构简介
  3. Linux显示中文【原创】
  4. Scrapy运行时出现的错误 :exception.ImportError No module named win32api
  5. 典型关联分析(CCA)原理总结
  6. C++ 有理数运算符重载
  7. 如何获取win10安装驱动
  8. gmtime() php,C语言gmtime()函数:把clock中的时间转换为格林尼治标准时间
  9. 无法找到 :import javax.annotation.Resource-------Resource 这个注解
  10. double d C语言,1,若有以下定义,char a;int b;float c;double d;... 若有以下语句,则正确的描述是,C语言...
  11. Codeforces ~ 1009C ~ Annoying Present (贪心)
  12. 王祥林 计算机专业英语答案,计算机专业英语 第3版 配套习题 作者 王祥林 陈静姣 模拟试题1.doc...
  13. 换钱计划调用函数c语言编程,CCF NOI1034 钞票兑换
  14. sqlsession生命周期
  15. 虚拟化Citrix Prob “VDI态势感知” 功能介绍
  16. Mysql systemctl start mysqld报错的问题解决
  17. Android M ROM 层拦截电话
  18. 柯美c7000服务器显示00,柯尼卡美能达bizhub PRESS C7000 故障排除.pdf
  19. python矩阵的右下半部分【简单易懂,代码可以直接运行】
  20. 新站百度不收录的原因和解决办法(2022最新)

热门文章

  1. Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)
  2. MySQL触发器 trigger学习
  3. 【起航计划 011】2015 起航计划 Android APIDemo的魔鬼步伐 10 App-Activity-Reorder Activities 后退栈 Intent FLAG...
  4. 【生活智慧】005.信守诺言的约束
  5. Arcgis Server初学笔记(一)
  6. vue3学习笔记 Composition API setup
  7. Vuex说明及Todos项目改造
  8. Spring AOP 实战运用
  9. 多线程(同步代码块和同步函数)
  10. C#中往数据库插入/更新时候关于NUll空值的处理