当前位置: 首页 > news >正文

回溯法:生成一个字符串的所有排列组合

问题:字符串abcd怎样获取abcd、acbd、acdb、adbc、adcb、bacd、bcad、bdac、bdca、cabd、cdba、cadb、cbda等,所有排列。

使用回溯法来生成一个字符串的所有排列

import java.util.ArrayList;
import java.util.List;public class Permutations {public static void main(String[] args) {// 目标字符串String str = "abcd";// 调用permute方法获取所有排列,并打印结果List<String> permutations = permute(str);for (String permutation : permutations) {System.out.println(permutation);}}/*** 生成字符串的所有排列。* @param str 输入的字符串* @return 包含所有排列的列表*/private static List<String> permute(String str) {List<String> result = new ArrayList<>();// 如果字符串为空或长度为0,则返回空列表if (str == null || str.length() == 0) {return result;}// 使用字符数组,并从第一个字符开始进行排列char[] chars = str.toCharArray();permuteHelper(chars, 0, result);return result;}/*** 递归辅助方法,用于生成排列。* @param chars 字符数组,用于交换字符以生成排列* @param index 当前处理字符的位置索引* @param result 存储所有排列结果的列表*/private static void permuteHelper(char[] chars, int index, List<String> result) {// 如果已经处理到最后一个字符,将当前排列加入结果列表if (index == chars.length - 1) {result.add(new String(chars));} else {// 对于每个未处理的字符,都尝试将其放在当前位置for (int i = index; i < chars.length; i++) {// 交换当前字符与待处理字符swap(chars, index, i);// 递归处理下一个字符位置permuteHelper(chars, index + 1, result);// 回溯:恢复交换前的状态,以便尝试下一个字符swap(chars, index, i);}}}/*** 交换字符数组中的两个元素。* @param array 字符数组* @param a 第一个元素的索引* @param b 第二个元素的索引*/private static void swap(char[] array, int a, int b) {char temp = array[a];array[a] = array[b];array[b] = temp;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算组的妙用!!页面权限控制
  • 【web APIs】快速上手Day05(Bom操作)
  • Java求解百钱买百鸡问题(课堂实例2)
  • Ubuntu24.04LTS基础软件下载
  • SystemUIService启动-Android13
  • 高防服务器的重要性
  • 增量联邦学习是什么
  • 【JavaEE】多线程进阶
  • 华为路由器静态路由配置(eNSP模拟实验)
  • 动态规划 剪绳子问题
  • Rust变量绑定
  • SQLAlchemy迁移数据库
  • 路由器是什么?
  • [数据结构] 归并排序快速排序 及非递归实现
  • 机器学习简介--NLP(二)
  • ES6指北【2】—— 箭头函数
  • [deviceone开发]-do_Webview的基本示例
  • 【RocksDB】TransactionDB源码分析
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Cookie 在前端中的实践
  • Docker 笔记(2):Dockerfile
  • Kibana配置logstash,报表一体化
  • leetcode98. Validate Binary Search Tree
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • pdf文件如何在线转换为jpg图片
  • 闭包--闭包作用之保存(一)
  • 创建一个Struts2项目maven 方式
  • 从PHP迁移至Golang - 基础篇
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 使用parted解决大于2T的磁盘分区
  • 世界上最简单的无等待算法(getAndIncrement)
  • 移动端解决方案学习记录
  • 异常机制详解
  • 用mpvue开发微信小程序
  • 优秀架构师必须掌握的架构思维
  • ionic异常记录
  • MyCAT水平分库
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​io --- 处理流的核心工具​
  • ​水经微图Web1.5.0版即将上线
  • #、%和$符号在OGNL表达式中经常出现
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (1)STL算法之遍历容器
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (搬运以学习)flask 上下文的实现
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)fiber的基本认识
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Unity3DUnity3D在android下调试
  • (转)为C# Windows服务添加安装程序