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

news/2024/7/8 7:42:26 标签: java, 开发语言

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

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

java">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;
    }
}


http://www.niftyadmin.cn/n/5536806.html

相关文章

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

Nature Communications|用于电子皮肤的自主自愈晶体管(柔性半导体器件/电子皮肤/柔性电子)

2024年4月23日,韩国庆熙大学Jin Young Oh,美国斯坦福大学鲍哲南(Zhenan Bao)和韩国嘉泉大学Tae Il Lee团队,在《Nature Communications》上发布了一篇题为“Autonomous self-healing supramolecular polymer transistors for skin electronics”的论文。论文内容如下: 一…

从OpenAI停服看中国市场:国产替代崛起的机遇与挑战

一、OpenAI 停服事件背景 OpenAI 自 2020 年推出 GPT-3 以来&#xff0c;在全球范围内引起了极大的反响。其强大的自然语言处理能力使其成为许多企业和开发者的首选工具。然而&#xff0c;2024 年 6 月 25 日&#xff0c;许多中国用户收到了一封来自 OpenAI 的邮件&#xff0c…

DFS之搜索顺序——AcWing 1116. 马走日

DFS之搜索顺序 定义 DFS之搜索顺序是指在执行深度优先搜索时&#xff0c;遍历图或树中节点的策略。具体而言&#xff0c;DFS会沿着一条路径深入到底&#xff0c;当无法继续深入时回溯&#xff0c;然后选择另一条未探索的路径继续深入。搜索顺序直接影响到搜索效率和剪枝的可能…

多态的优点

多态的优点 1、多态的优点1.1 可替换性&#xff08;Substitutability&#xff09;2、可扩充性&#xff08;Extensibility&#xff09; 2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、多态的优点 在面向对象编程&#xff08;OOP…

Witness Table 的由来

“Witness Table” 是 Swift 中的一个术语&#xff0c;源于编译原理和类型系统的概念。它被用来表示一种机制&#xff0c;通过这个机制&#xff0c;编译器可以确保某个类型确实实现了它声明遵循的协议中的所有方法和属性。下面是对这个术语的详细解释&#xff1a; 1. 术语来源…

大数据处理引擎选型之 Hadoop vs Spark vs Flink

随着大数据时代的到来&#xff0c;处理海量数据成为了各个领域的关键挑战之一。为了应对这一挑战&#xff0c;多个大数据处理框架被开发出来&#xff0c;其中最知名的包括Hadoop、Spark和Flink。本文将对这三个大数据处理框架进行比较&#xff0c;以及在不同场景下的选择考虑。…

Linux基础 - 常用命令

目录 零. 简介 一 . 常见 Ubuntu 命令 二. apt-get 下载 三. 网络命令 四. 常用命令的总结 零. 简介 在 Ubuntu 中&#xff0c;命令是用于与操作系统进行交互和执行各种操作的指令。通过在终端中输入命令&#xff0c;可以完成文件管理、系统配置、软件安装、进程管理等各种…