排列与组合的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【php】 自带的过滤机制

<?php print_r(filter_list()); ?>输出类似&#xff1a; Array ( [0] > int [1] > boolean [2] > float [3] > validate_regexp [4] > validate_url [5] > validate_email [6] > validate_ip [7] > string [8] > stripped [9] > encoded…

Source Insight 4.0安装教程(PS:附安装包及卸载重新安装等注意事项)

目录一、Source Insight 4.0安装包二、删除配置文件&#xff08;初次安装忽略此步骤&#xff09;1、清除注册表信息&#xff1a;2、删除全局配置信息&#xff1a;三、安装步骤1、解压2、安装3、替换4、破解5、安装提示unable to open or create...解决方案一、Source Insight 4…

通过远程(vnc)无法打开qtcreator

最近打算移植qt程序到板子上于是&#xff0c;在ubuntu物理机上装了qt开发环境&#xff0c;通过远程桌面链接上去写qt。 但是远程老是点不开qtcreator。于是通过命令行启动 出了报错信息&#xff0c;应该和xserver 服务有关&#xff0c;没有深入了解错误 下面是我的解决方案&a…

tomcat限速_网络限速

基本介绍上下行速度上行就是上传的速度,下行就是下载的速度,上行速率一般是指从你的电脑上传的速度&#xff0c;也就说别人从你的电脑进行通讯的速率&#xff01;下行速率一般是你从网络上的主机下载速度&#xff01;我们访问互联网的过程中存在这两种行为&#xff1a;一是上传…

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局

iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一、项目文件结构和plist文件 二、实现效果 三、代码示例 1.没有使用配套的类&#xff0c;而是直接使用xib文件控件tag值…

硬件模块化开发的例子:LD3320语音模块与Source Insight的使用

目录硬件模块化开发的行情LD3320语音模块使用手册介绍&#xff1a;语音模块验货测试硬件连接效果图测试结果良好Source Insight代码查看器创建工程修改字体配色方案中文乱码关联代码语音识别模块代码分析语音识别模块二次开发硬件模块化开发的行情 LD3320语音模块使用手册介绍&…

ubuntu 远程桌面及Qt安装

环境&#xff1a; ubunut14 x64 目标&#xff1a;通过vnc远程桌面&#xff0c;在ubuntu 上编写qt程序 1.安装远程桌面 apt-get install xrdp vnc4server xbase-clients dconf-editor #安装xrdp&#xff0c;vnc4server apt-get install gnome-panel gnome-settings-daemon m…

awk分割字符

为什么80%的码农都做不了架构师&#xff1f;>>> str1|_|2|_|3|_||_|4|_|5|_|6|_||_|7|_|8|_|9; 期望分割成 1|_|2|_|3 4|_|5|_|6 7|_|8|_|9 也就是以|_||_|做分割符&#xff0c;但是&#xff0c;字符段长度不确定&#xff0c;有可能分割成3段&#xff0c;也可能会有…

面经——嵌入式软件工程师面试遇到的经典题目

参考&#xff1a;嵌入式软件工程师面试遇到的经典题目 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-11-04 23:43:16 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/109499825 目录1、找错误2、下面的代码输出是什么&#xff0c;为什么&am…

axure实现复选框全选_AxureRP8实战手册-案例73(全选与取消全选效果)

案例73. 全选与取消全选效果案例来源:百度音乐-音乐盒案例效果&#xff1a;初始状态/取消全选时&#xff1a;(图5-117)全选后取消任一选项时&#xff1a;(图5-118)全选/单选全部选中时&#xff1a;(图5-119)案例描述&#xff1a;列表中相邻的行具有交替的背景颜色&#xff1b;点…

移植Linux3.4.2版本内核到mini2440

一. 内核启动流程&#xff0c;据此配置内核(机器ID) 1. 获取内核源码 www.kernel.org https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.2.tar.bz2 2. 解压内核 # tar xjvf linux-3.4.2.tar.bz2 3. 修改顶层Makefile&#xff0c;指定交叉编译器 ARCH ? arm CRO…

在浏览器的背后(二) —— HTML语言的语法解析

当你看到这篇文章意味着我辜负了教主的殷切期望周末木有去约会&#xff0c;以及苏老师我思故我在北京鼓楼的落井下石成功了…… 本文demo powered by 已经结婚的老赵的不再维护的wind.js 物是人非啊…… 说回正经事&#xff0c;在上一篇文章中&#xff0c;我们取得了初步成果&a…

面经——小米面经(2021春招)

摘自&#xff1a;小米面经&#xff08;2021春招&#xff09;——感谢小米、感谢雷总、感谢上官可编程 作者&#xff1a;阿波罗啦啦啦啦 发布时间&#xff1a; 2021-05-01 11:08:41 网址&#xff1a;https://blog.csdn.net/weixin_44933419/article/details/116325554 3月31日投…

使用arm混合汇编计算两个64位的和_混合使用C、C++和汇编语之: C、C++ 和 ARM 汇编语言之间的调用...

12.4C target_blank stylecursor:pointer;color:#D05C38;text-decoration:underline;>C、C和ARM汇编语言之间的调用本节提供一些示例&#xff0c;显示如何从C调用C和汇编语言代码&#xff0c;以及从C和汇编语言调用C代码。其中包括调用约定和数据类型。主要包括下面内容&…

记一次用WPScan辅助渗透WordPress站点

记一次用WPScan辅助渗透WordPress站点 一、什么是WPScan&#xff1f; WPScan 是一个扫描 WordPress 漏洞的黑盒子扫描器&#xff0c;它可以为所有 Web 开发人员扫描 WordPress 漏洞并在他们开发前找到并解决问题。我们还使用了 Nikto &#xff0c;它是一款非常棒的 Web 服务器评…

移植tslib(s3c2440)

解压安装tslib # tar -zxvf tslib-1.4.tar.gz # cd tslib # ./autogen.sh #echo “ac_cv_func_malloc_0 _nonnullyes”>arm-linux.cache # ./configure –hostarm-linux –cache-filearm-linux.cache -prefix/usr/local/tslib ac_cv_func_malloc_0_nonnullyes # make …

什么是Cortex、ARMv8、arm架构、ARM指令集、soc

参考&#xff1a;到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc&#xff1f;一文帮你梳理基础概念【科普】 发布时间&#xff1a; 一口Linux 网址&#xff1a;https://blog.csdn.net/daocaokafei/article/details/109008103 目录前言1. ARM公司2. ARM内核与架构1&#xff…

Windows下Qt5搭建Android开发环境笔记

Windows很大的特点是配置使用几乎都可以图形化进行&#xff0c;和Linux比起来在很多时候配置环境也要方便很多。所以&#xff0c;搭建Qt for Andorid也是十分简单的。需要以下工具&#xff1a;1.最方便的Qt官方包&#xff0c;现在还处于RC阶段&#xff0c;经过测试也是有些小bu…

大学python怎么过_大学生该不该学Python?太纠结了?

首先&#xff0c;在大学期间的学习任务应该围绕自身的专业课程体系来展开&#xff0c;对于计算机相关专业的同学来说&#xff0c;学习Python还是有一定必要的&#xff0c;作为一门全场景编程语言&#xff0c;Python在大数据、人工智能等领域的应用还是比较广泛的&#xff0c;掌…

python中的列表,添加元素,获取元素,删除元素,列表分片,常用操作符

一. 创建列表&#xff0c;分为创建普通列表&#xff0c;混合列表&#xff0c;和空列表。其中混合列表是指string&#xff0c;int&#xff0c; float等都可以写在同一个列表里&#xff0c;空列表是指列表可以为空 二. 在列表添加成员方法 1. append&#xff08;&#xff09…