排列与组合的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的排列。这样写成递归程序如下:
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递归实现 (参考)相关推荐
- 排列和组合简单的递归思路以及C++实现
本文将讲解如何通过递归的方法实现全排列和组合,会详细讲解递归的思路,最后还会给出c++实现的源码.先前学习数据结构和算法的时候一直没有弄明白它们的递归思路,今日遇到,细一思考,发现并没有之前那么难,于 ...
- 排列、组合问题(递归)
这里主要介绍字符串排列组合问题,高中数学常见的题目,不用详细介绍,看例子就可以解决问题 "1212" 全排列结果为 1212,1221,1122,2112,2121,2211 组合 ...
- 排列与组合中的递归策略(as3.0)
section 1. 字符串的全排列.譬如假定给定字符串为"abc",则全排列是"abc"的所有可能组合,且每一个字符都不相关.如"aaa" ...
- Java递归求全排列详解
Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...
- java 实现组合_用Java实现排列、组合算法
组合个数的计算公式如下: 那么,计算排列或组合的数量,通过上面的公式就很容易就算出来了,其Java的实现如下: /** * 计算阶乘数,即n! = n * (n-1) * ... * 2 * 1 * ...
- 通用的非递归排列和组合算法[附源码]
动机 Apache Math包中有很多关分布的算法,但是没有找到排列组合相关的算法.索性自己写一个.排列组合可以分两个算法: 组合算法,就是在一个数组中取出m(小于等于数组的长度 n)个对象,有多少中 ...
- 排列组合问题Java实现
上一篇博客写了怎样实现一个字符串的全排列,并且也给出了代码,在看这篇博客前先将上一篇博客搞懂,这篇看起来就很简单了.这篇将讲解一个从M个数中选取N(N<=M)个数的排列和组合,这里先说明一下,M ...
- java排列和组合算法
package com.louisgeek.price;/*** 排列和组合算法* @author Administrator**/ public class CaseTest {public sta ...
- 回溯算法团灭子集、排列、组合问题
回溯算法团灭子集.排列.组合问题 一.子集 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] ...
最新文章
- innodb 悲观锁 乐观锁_mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁
- FPGA内部硬件结构简介
- Linux显示中文【原创】
- Scrapy运行时出现的错误 :exception.ImportError No module named win32api
- 典型关联分析(CCA)原理总结
- C++ 有理数运算符重载
- 如何获取win10安装驱动
- gmtime() php,C语言gmtime()函数:把clock中的时间转换为格林尼治标准时间
- 无法找到 :import javax.annotation.Resource-------Resource 这个注解
- double d C语言,1,若有以下定义,char a;int b;float c;double d;... 若有以下语句,则正确的描述是,C语言...
- Codeforces ~ 1009C ~ Annoying Present (贪心)
- 王祥林 计算机专业英语答案,计算机专业英语 第3版 配套习题 作者 王祥林 陈静姣 模拟试题1.doc...
- 换钱计划调用函数c语言编程,CCF NOI1034 钞票兑换
- sqlsession生命周期
- 虚拟化Citrix Prob “VDI态势感知” 功能介绍
- Mysql systemctl start mysqld报错的问题解决
- Android M ROM 层拦截电话
- 柯美c7000服务器显示00,柯尼卡美能达bizhub PRESS C7000 故障排除.pdf
- python矩阵的右下半部分【简单易懂,代码可以直接运行】
- 新站百度不收录的原因和解决办法(2022最新)
热门文章
- Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)
- MySQL触发器 trigger学习
- 【起航计划 011】2015 起航计划 Android APIDemo的魔鬼步伐 10 App-Activity-Reorder Activities 后退栈 Intent FLAG...
- 【生活智慧】005.信守诺言的约束
- Arcgis Server初学笔记(一)
- vue3学习笔记 Composition API setup
- Vuex说明及Todos项目改造
- Spring AOP 实战运用
- 多线程(同步代码块和同步函数)
- C#中往数据库插入/更新时候关于NUll空值的处理