Java递归实现字符串的排列和组合

字符串排列和组合的JAVA实现 [No. 44] 字符串的组合: 给一个字符串,比如ABC, 把所有的组合,即:A, B, C, AB, AC, BC, ABC, 都找出来。 解题思路: 假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩下的n-1个 阅读详情

我们在笔试中经常会遇到需要对字符串进行排列或者组合的题目。本篇文章对字符串的排列和组合进行递归版本的实现。

1. 字符串的组合

题目:输入一个字符串,输出该字符串中字符的所有组合。

例子:输入:abc,它的组合有:a、b、c、ab、ac、bc、abc

分析:我们可以将字符串中的每个字符看成二叉树的一个节点,根节点为空,每个节点都会有两种选择:要 和 不要 两种选择 。那么我们就可以利用递归实现。

  • 代码实现:

package com.offer.manongqiuzhi.String;
/** * @author pcwl * @description:递归实现字符串的组合 */public class CombinationString {
public static void printAllSubString(String str){ if(str == null){ return; }
char[] chars = str.toCharArray(); if(chars.length > 0){ String pre = new String(""); // pre:用于表示从0到i-1位置上形成的结果 printAllSubString(0, pre, chars); }else{ System.out.println(""); // 输入空字符串也会打印空 } }
public static void printAllSubString(int i, String pre, char[] chars){ // 迭代终止条件 if(i == chars.length){ // 说明已经到最后一个字符了,所有的选择都已经做完了,应该返回了 System.out.println(pre); return; }
// 如果没有到最后一个字符,那么当前字符有两种选择:选择要 和 选择不要 printAllSubString(i + 1, pre, chars); // 不要当前字符 printAllSubString(i + 1, pre + String.valueOf(chars[i]), chars); // 要当前字符 }
// 测试 public static void main(String[] args) { printAllSubString("abc"); }}

运行结果:

2. 字符串的排列

01

全排列 

题目:输入一个字符串,打印出该字符串中字符的所有排列。

举例:输入字符串 abc,则输出由字符 a、b、c 所能排列出来的所有字符串 abc、acb、bac、bca、cab 和 cba。

分析:排列和上面的组合问题思想是一样的:上面的组合问题,每个节点只有 “要” 和 “不要” 两种选择,而排列这里每个节点 i 有  n - i 种选择。
排列问题:所有的排列都是包含该字符串中所有的字符,所以不需要像组合那样利用额外的空间 pre 记录选择的过程。
需要注意的是:i 位置在进行选择的时候,会先和 i + 1 位置交换位置,搞定 i + 1 后面的排列后,会再和 i + 2 ~ n - 1 位置上的每个元素交换一次,所以为了保证都是和 i 位置上的元素进行交换,每次递归一次后,必须要将 i 位置元素再换回原来的位置。
可以直观的理解下:加入现在搞定 i 位置上元素,i  一共有 n - i 种选择,每次 i 位置固定后,i + 1 ~ n - 1 位置上的元素都是同样递归实现。
  • 代码实现:
package com.offer.manongqiuzhi.String;
/** * @author pcwl * @description:递归实现全排列 */public class PermutationString { public static void printAllSort(String string){ if(string == null){ return; }
char[] chars = string.toCharArray(); if(chars.length > 0){ printAllSort(0, chars); } }
// 对i及i以后的字符进行全排列 public static void printAllSort(int i, char[] chars){ // 递归终止条件 if(i == chars.length){ System.out.println(String.valueOf(chars)); }
for(int j = i; j < chars.length; j++){ swap(i, j, chars); // 第 i 个位置有 i ~ (n - 1) 种选择。n 为字符串的长度 printAllSort(i + 1, chars); swap(i, j, chars); // 保证 i 后面的字符每次都是和 i 位置上的元素进行的交换,还需要将 i 和 j 交换回来 } }
public static void swap(int i, int j, char[] chars){ int temp = chars[i]; chars[i] = chars[j]; chars[j] = chars[i]; }
public static void main(String[] args) { printAllSort("abcc"); }}
运行结果:

02

去重全排列 

只需要增加一个 hashset,用于保证重复字符不会被再次交换。
package com.offer.manongqiuzhi.String;
import java.util.HashSet;
/** * @author pcwl * @description:递归实现全排列(去重) */public class StringByRemoveDuplicate { public static void printAllSort(String string){ if(string == null){ return; }
char[] chars = string.toCharArray(); if(chars.length > 0){ printAllSort(0, chars); } }
// 对i及i以后的字符进行全排列 public static void printAllSort(int i, char[] chars){ // 递归终止条件 if(i == chars.length){ System.out.println(String.valueOf(chars)); }
// 用于保证每次交换的字符不存在重复的字符 HashSet<Character> set = new HashSet<>(); for(int j = i; j < chars.length; j++){ if(!set.contains(chars[j])){ set.add(chars[j]); // 第 i 个位置有 i ~ (n - 1) 种选择。n 为字符串的长度 swap(i, j, chars); printAllSort(i + 1, chars); // 保证 i 后面的字符每次都是和 i 位置上的元素进行的交换,还需要将 i 和 j 交换回来 swap(i, j, chars); } } }
public static void swap(int i, int j, char[] chars){ int temp = chars[i]; chars[i] = chars[j]; chars[j] = chars[i]; }
public static void main(String[] args) { printAllSort("abcc"); }}
运行结果:

--------  END  ---------

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。关注公众号并回复 888 领取,更多内容陆续奉上   


java m取n 重复 不重复 排列组合 for循环嵌套递归 立即下载

相关推荐

java 用递归实现字符串反转

java 用递归实现字符串反转 java 用递归实现字符串反转

java之字符串拼接

本文介绍了什么是字符串拼接,虽然字符串是不可变的,但是还是可以通过新建字符串的方式来进行字符串的拼接。常用的字符串拼接方式有五种,分别是使用、使用concat、使用、使用以及使用。由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。因此,经过对比,我们发现,直接使用的方式是效率最高的。因为天生就是设计来定义可变字符串和字符串的变化操作的。但是,还要强调的是:1、如果不是在循环体中进行字符串拼接的话,直接使用就好了。

白话机器学习 528

配置VS Code使用Linux服务器上的Matlab

0、需求 Linux服务器上安装有Matlab 无图形界面,只能使用命令行工具,编辑文件不方便 1、VS Code插件安装 在扩展商店中搜索matlab,会出现Matlab Extension Pack,里面有整理好的matlab扩展 这里只安装了第一排的三个扩展 2、设置(Windows、Mac的设置类似,只是不同系统的文件路径不同) 安装好扩展,重启VS Code后,进行设置 打开:文件→首选项→设置(或快捷键ctrl+,),搜索matlab,结果如下图所示;直接打开完整json配置文件(图

赵彬的博客 5008

Java中常见字符串拼接九种方式,总有一款你喜欢!

在 Java 编程中,字符串拼接是一项非常基础的操作,它涉及到了很多日常开发工作中常见的场景,例如拼接 SQL 语句、构建 HTTP 请求参数等等。因此,对于掌握好字符串拼接技巧不仅有助于提高代码效率,而且能够避免一些潜在的性能问题。下面我们就来列举出来几种方式,搭配例子!在 Java 中,字符串拼接是很常见的操作。不同的场景需要选择合适的字符串拼接方式,以达到更高的效率和更好的代码可读性。理解字符串拼接的不同方式,选择适合当前场景的方法能够提高代码效率、可读性和可维护性。

小王博客基地 2万+

【Unity】RPG2D龙城纷争(十九)流程与UI界面(终章)

本章为RPG2D系列的终章,在之前的章节中我们已经完成了游戏的所有基本功能,那么用流程与UI界面将其串联起来才是我们整个游戏原型完善的标志。

神码编程 917

5、癌症数据预处理技术与深度学习在癌症预测中的应用

本文详细介绍了癌症数据预处理技术和深度学习在癌症预测中的应用。针对CT扫描图像、X射线图像、超声图像、基因表达数据和文本数据等不同类型的癌症数据,分别阐述了去噪、插值、配准、归一化等预处理技术的具体方法。同时,分析了深度学习在乳腺癌、白血病和宫颈癌预测中的作用,结合相关影响因素探讨了模型的应用潜力。此外,还总结了深度学习在癌症预测中面临的挑战及未来发展方向,为癌症的早期诊断与精准预测提供了理论支持和技术参考。

alice7model的博客 123

java字符串拼接常用方式

方式一:+ “+”,是java操作运算符比较常用的,也是简单直接的一直方式。 String aa = "魅言倾馨"; String bb = "子非我鱼"; System.out.println(aa+bb); 方式二:StringBuilder.append()和StringBuffer.append() 先有StringBuffer后有StringBuilder,两者就像是孪生双胞胎,该有的都有,只不过大哥StringBuffer,大部分方法都经过synchroni

qq_45752401的博客 9467

在 ABAP Cloud 中玩转 CL_ABAP_PARALLEL 并行处理:从原理到实战

ABAP并行处理框架CL_ABAP_PARALLEL解析 本文系统介绍了SAP ABAP环境中实现并行处理的CL_ABAP_PARALLEL框架。该框架通过封装异步RFC和对话进程,为开发者提供了面向对象的API,显著提升大批量数据处理的效率。 文章首先分析了ABAP环境需要并行处理的原因:传统的串行处理在面对百万级数据时效率低下。然后详细介绍了CL_ABAP_PARALLEL的设计思路,它是一个"小型线程池"式的同步并行框架,适用于批量计算场景。此外,文章重点讲解了控制并行任务的关键参

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 339

遇到字符串拼接用它就对啦!什么你居然不知道Java中对象作为方法参数和基本数据类型作为参数的区别?有巨坑!

通过例题理解什么Java中对象的引用作为参数与基本数据类型作为参数的区别,StringBuilder类的总结。代码随想录第17天打卡:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

rememberE0065的博客 1322

由ip地址和子网掩码求网络号、主机号、广播地址(超详细)

1、用二进制数表示IP地址   在进行计算之前,我们首先要学会十进制的IP地址怎么转换为二进制的IP地址。   给出一个例子: 十进制:172.16.25.3 二进制:10101100.00010000.00011001.00000011 1、如果两台主机的网络号相同,我们就说它们是同一网段 2、主机号的意义 - 1)主机号部分全变成1,即为该网段的广播地址 - 2)主机号部分全变成0,即为该网段的网路地址(网络号) 3、如果主机号部分为x位,则该网络能容纳最大主机数为: 2的x次方-2。减2

爱吃雪糕的小布丁的博客 9万+

YOLOv13必学核心:SKAttention选择性核注意力机制原理 + 实战全拆解

SKAttention的核心思想来源于人类视觉系统的一个重要特性:根据不同的视觉刺激,人眼能够自适应地调整感受野大小。SKAttention将这一生物学原理转化为深度学习中的注意力机制,通过动态选择和融合不同大小的卷积核,实现了自适应的多尺度特征提取。在人类视觉皮层中,不同的神经元具有不同大小的感受野,而且这些感受野的大小会根据视觉刺激的类型动态调整。本文将深入解析SKAttention模块的设计原理、数学基础、实现细节,以及其在YOLOv13目标检测框架中的集成应用,为读者提供全面而深入的技术理解。

FJN110的博客 96

Java中字符串拼接的几种方式(源码分析)

字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起。 我们都知道,String是Java中一个不可变的类,所以他一旦被实例化就无法被修改。 不可变类的实例一旦创建,其成员变量的值就不能被修改。这样设计有很多好处,比如可以缓存hashcode、使用更加便利以及更加安全等。 字符串拼接的几种方式 1. 使用“+”号 在日常的开发中,我们使用+进行拼接的频率是非常高的 String s = "abc"; s = s + "y"; System.out.println(s); 输出

Crazy_young_man的博客 8324

【STK】手把手教你利用STK进行导弹和反导仿真02 - STK/MMT模块01 导弹任务分析工具概述

种工具:导弹设计工具(Missile Design Tool,MDT )、导弹飞行工具(Missile Flight Tool,截弹,或者用内置拦截弹编辑器创建的个性化的拦截弹, IFT 能够对 ―一对一 ‖动能拦截。导设置系统参数, 并对其有效性进行验证, 画性能图,保证该设计是可行的。(SAIC)公司联合开发研制,极大扩展了 STK 原有的导弹对象的功能,能够精确仿真。IFT 能够对拦截飞机、 导弹、卫星等目标进行仿真和分析。(2)推进系统参数,包括推力,比冲,秒流量,推力持续时间,喷嘴出口面积,

weixin_44184852的博客 1876

Java字符组合详解:如何实现字符排列与组合

比如字符串 “abcd” 可以排列为 “abcd”、”abdc”、”acbd”、”acdb”、”adbc”、”adcb”、”bacd”、”badc”、”bcad”、”bcda”、”bdac”、”bdca”、”cabd”、”cadb”、”cbad”、”cbda”、”cdab”、”cdba”、”dabc”、”dacb”、”dbac”、”dbca”、”dcab”、”dcba”。在字符组合中,我们可以将每个字符用一个二进制位来表示,0表示未选中,1表示已选中,然后进行循环遍历,输出所有可能的组合。

我点评的博客 1857

SA8155P QCOM 车载系统介绍

高通车载相机开发

qq_37057338的博客 5223

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java字符串组合_Java实现abc字符串排列组合

1.可重复排列:abc三个字符组成的所有长度为3的字符串,aaa,aab,aac......ccc 一共27种利用递归的思想,第一个字符可以从abc中选择一个,三种选择,之后问题转化为abc组成长度为2的字符的情况,循环递归后可以求出所有的可能。控制好循环退出条件即可。利用递归可以处理,不知道字符长度的情况下,即通用处理。如果知道长度,只需要利用多层循环,也可以得出结论。public class ...

weixin_42528191的博客 3000

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

用递归实现排列组合(java代码)

全排列递归算法思想:假设求abcdefg的全排列,先将第一个字母确定为a,然后求bcdefg的全排列就行了,然后将a与b交换位置,重复上述过程,直到a和g交换。 全组合递归算法思想:假设求abcdefg的全组合,分两种情况,一、将a放入组合中,再求出剩下的bcdefg的组合。二、不将a放入组合,求出剩下的bcdefg的组合。 下面看代码:package practise;public class

周孙静的博客 4746

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java 字符串排列组合_java实现字符串排列组合问题

本文为大家介绍了java实现字符串排列组合问题,供大家参考,具体内容如下import java.util.ArrayList;import java.util.Collections;/*** 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,* bca,cab和cba。** @author pom...

weixin_39946274的博客 640

java实现字符串的全排列和字符串的所有组合

题目:输入一个字符串,求出该字符串的所有的排列,例如输入abc,则可以得到的所有的字符串的排列为abc,acb,bac,bca,cab,和cba。 如何求一个字符串的全排列呢,猛然间看到这个题目自己一下子还真的想不出来如何求解。 当我们拿到一个字符串手工去求解的时候,如何得到字符串的所有的排列, 当我们拿到字符串abc的时候,我们求他的全排列的话,为了知道应该继续排列哪里,我们一般情况下给是先固定...

liu_12345_liu的博客 3167

排列问题java_java实现字符串排列组合问题

本文为大家介绍了java实现字符串排列组合问题,供大家参考,具体内容如下import java.util.ArrayList;import java.util.Collections;/*** 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,* bca,cab和cba。** @author pom...

weixin_42282482的博客 442

java字符串排列组合_含有重复字符的字符串排列组合

1. 定义排列:从给定个数的元素中取出指定个数的元素进行排序组合:从给定个数的元素中取出指定个数的元素,不考虑排序2. 两个的关系排列包含了组合的过程,从给定个数的元素中取出指定个数元素(组合),然后再把取出的元素进行排序。这意味着,我们利用组合得到组合数,然后利用组合数实现全排列,就得到了排列。一般组合指的是取出1~n个元素的组合,因为全组合只有一个3. 字符串的排列组合算法3.1 不含重复字符...

weixin_39942335的博客 1465

java字符串组合_【算法与数据结构】Java实现字符串的全排列及组合

注:本文记录了代码编写及调试过程,想直接浏览正确答案的请移步文章结尾。一、字符串的全排列问题1. 下面是最初的代码(答案有错误-重复输出)1 importjava.util.Scanner;23 public classMain {4 public static voidmain(String[] args) {5 Scanner sc = newScanner(Syste...

weixin_39732866的博客 356

php 不重复字符串所有排列结果,给定一个字符串,找出其所有不重复的排列组合...

给一个字符串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出来。解题思路:对于一个n 位的字符串来讲,它是n-1位字符串的排列 加上 没有在 n -1 位字符串里 那个字符 的排列。比如:对于字符串ABC来讲,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。而BC的排列是 B + C 的排列 加上 C...

weixin_39768083的博客 285

排列 组合 java_java 实现 排列 组合

import java.util.ArrayList;/***** permutation and combination** @author Administrator*/public class Pac {Pac(String str) {this.str = str;}String str;//源字符串。String state;//c or a 状态/** 组合数*/public void...

weixin_29696999的博客 203

【Java】面试题38:字符串的排列

题目: 输入一个字符串,打印出该字符串的所有排列。例如,输入字符串abc,则打印出所有字符串:abc,acb,bac,bca,cab,cba 思路: 面对这样的题目,我们需要将复杂问题分解化,分解成一个一个小问题。将一个字符串分为两部分:第一部分为它的第一个字符,第二部分为后面所有的字符,如下图所示: 求整个字符串的全排列,可以看成两步:第一步首先求所有可能出现在第一个位置的字符,即把第一个字符和...

小小核桃 193

递归算法之全排列生成(Permutations)详细解读

全排列(Permutations)是指从给定的 𝑛个元素中,按照某种顺序进行排列,生成所有可能的顺序组合。全排列是排列组合中的一个重要问题,在算法、数学、以及计算机科学中有着广泛的应用。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 3130
上一篇: 99%的人都需要:最牛数据分析+Python入门教程资料,不花一分钱,免费领!
下一篇: 新手也能看懂的线程池学习总结
程序员乔戈里
博客等级 码龄8年 1057粉丝 220原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值