大厂面试:获取字符串的全排列

一、概念
现有一个字符串,要打印出该字符串中字符的全排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。
可以基于回溯法来解决这个问题。

二、代码

public class Permutation {
    //输出字符串str的全排列组合
    public void dump(String str) {
        List<String> list = getPermutation(str);
        for(String s:list) {
            System.out.println(s);
        }
    }
    //返回字符串str的全排列组合
    public List<String> getPermutation(String str) {
        List<String> resultList = new ArrayList<>();
        //若字符串长度为0,则返回空列表
        if(null==str|| str.isEmpty()){
            return (List<String>)resultList;
        }else {
            //递归的初始值为(str数组,空的结果list,初始下标0)
            backtrace(str.toCharArray(),resultList,0);
            Collections.sort(resultList);
            return (List<String>)resultList;

        }
    }

    /**
     * 回溯算法
     * @param array 字符数组
     * @param list  结果列表
     * @param index 执行交换的索引
     */
    private void backtrace(char[] array,List<String> list,int index){
        //若索引已到最后,则做好收集存储,并返回
        if(index == array.length-1){
            if(!list.contains(new String(array))){
                list.add(new String(array));
                return;
            }
        }
        //若索引未到最后一个位置,则继续执行
        else{
            for(int j=index;j<array.length;j++){
                //交换索引index和j的元素
                swap(array,index,j);
                //继续回溯算法
                backtrace(array,list,index+1);
                //再复原回去
                swap(array,index,j);
            }
        }
    }
    //交换array字符数组中索引为i和j位置的元素
    private void swap(char[] array, int i, int j) {
        if (i != j) {
            char t = array[i];
            array[i] = array[j];
            array[j] = t;
        }
    }
}


致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享。

若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢。您的支持是我们为您提供帮助的最大动力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自媒体创作利器】AI白日梦+ChatGPT 三分钟生成爆款短视频

AI白日梦https://brmgo.com/signup?codey5no6idev 引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI在各个领域都展现出了强大的应用潜力。其中&#xff0c;自然语言处理技术的进步使得智能对话系统得以实现&#xff0c;而ChatGPT作为其中的代表之一…

【Linux】磁盘阵列RAID技术

目录 一、RAID介绍 1.1 什么是RAID技术&#xff1f; 1.2 为什么要使用RAID技术&#xff1f; 二、RAID级别 2.1 常见的RAID级别 2.2 常见RAID介绍 三、RAID特性对比 一、RAID介绍 1.1 什么是RAID技术&#xff1f; 把多块独立的物理磁盘按不同的方式组合起来形成一个硬盘…

人工智能讲师大模型培训老师叶梓:基于大型语言模型的自主智能体:架构设计与应用前景

在人工智能的快速发展中&#xff0c;大型语言模型&#xff08;LLM&#xff09;已成为推动技术进步的关键力量。LLM的出现不仅改变了我们与机器的交互方式&#xff0c;也为构建具有高级认知能力的自主智能体&#xff08;AI Agent&#xff09;提供了新的可能性。本文旨在探讨基于…

(非技术) 基因遗传相关知识学习笔记

目录 一、基因遗传名词解释 二、什么叫显性遗传和隐性遗传&#xff1f; 三、如何确定遗传性质呢&#xff1f;是显性还是隐性&#xff1f; 四、常规例子1&#xff1a; 五、常规例子2&#xff1a; 六、实际案例&#xff1a; 七、思考题&#xff1a; 八、参考&#xff1a; …

云计算: OVN 集群 部署分布式交换机

目录 一、实验 1.环境 2.OVN 集群 部署云主机 3.中心端添加DVS分布式大二层交换机 二、问题 1.南向控制器查看主机名只显示localhost 2.中心端如何添加DVR分布式⼤三层路由器 一、实验 1.环境 (1) 主机 表1 宿主机 主机架构软件主要服务IP备注ovn_central中心端 ovn…

【Linux】基础I/O>文件系统软硬链接动静态库详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.C语言文件接口 1.1 hello.c写文件 1.2 hello.c读文件 1.3 输出信息到显示器 1.4 stdin & stdout & stderr 1.5 总结打…

Android Framework学习笔记(3)----Binder

什么是Binder&#xff1f; Binder是linux IPC机制的其中一种。它贯穿于应用层&#xff0c;framework层&#xff0c;以及linux Core层。 什么是IPC? 跨进程通信&#xff0c; InterProcess Communication. IPC机制都有哪些&#xff1f; 通道信号量消息队列BinderSocket共享内…

从IPv4到IPv6:解密网络通信的新时代

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 从IPv4到IPv6&#xff1a;解密网络通信的新时代 前言ipv4介绍ipv6介绍IPv4与IPv6的区别IPv4地址枯竭问题和IPv6的解决方案 ipv6的优势IPv6在新兴技术领域的应用 ipv4向ipv6的过渡挑战解决方案IPv6部署…

NVIDIA全系列GPU技术路线演进分析

NVIDIA GPU 架构梳理 近期深入研究并行计算,需探究底层硬件精髓。高性能计算界,英伟达显卡稳居霸主地位。本文旨在梳理NVIDIA GPU架构之演进历程,助您洞悉其技术脉络,把握未来计算趋势。 目录: NVIDIA GPU架构历经数次革新:从Tesla架构奠定基石,到Fermi架构提升性能,再…

【JAVA基础篇教学】第十五篇:Java中Spring详解说明

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第十五篇&#xff1a;Java中Spring详解说明。 Spring 框架是一个广泛应用于 Java 开发的轻量级、全栈式的企业应用开发框架&#xff0c;它提供了众多功能强大的模块&#xff0c;用于简化企业级应用程序的开发。下面详细说…

MySQL慢查询日志配置指南:发现性能瓶颈,提升数据库效率

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MySQL慢查询日志配置指南&#xff1a;发现性能瓶颈&#xff0c;提升数据库效率 前言慢查询日志介绍配置慢查询日志配置慢查询日志失效日志格式与记录内容高级配置与注意事项配置过程中的注意事项&…

【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

EasyRecovery激活秘钥2024最好用的电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具&#xff0c;它旨在帮助用户从各种存储设备中恢复由于各种原因&#xff08;如误删除、格式化、病毒攻击、系统崩溃等&#xff09;导致丢失的数据。这款软件支持多种存储介质&#xff0c;包括但不限于硬盘驱动器、U盘…

白盒测试之路径覆盖与基本路径覆盖

白盒测试之路径覆盖与基本路径覆盖&#xff08;蓝桥课学习笔记&#xff09; 1、路径覆盖 实验介绍 程序中的路径是执行程序时经过的分支的集合。路径覆盖法是指设计一定数量的测试用例运行被测程序&#xff0c;使程序中的所有路径都至少被执行一次。路径覆盖率的计算方法为&a…

web前端js笔记

1&#xff0c;对象 let{ 属性 方法 } 2&#xff0c;闭包 只有函数内部的子函数才能读取局部变量&#xff0c;所以闭包可以理解成定义在一个函数内部的函数&#xff0c;在本质上&#xff0c;闭包是将函数内部和函数外部连接起来的桥梁。 3&#xff0c;math console.log(Math.flo…

✌粤嵌—2024/4/15—汇总区间

代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ char** summaryRanges(int* nums, int numsSize, int *returnSize) {char **res malloc(sizeof(char*) * numsSize);*returnSize 0;int i, j;for (i 0; i < numsSi…

npm run serve报错:error:0308010C:digital envelope routines::unsupported

这是因为Node.js17中的OpenSSL加密库不支持当前的加密设置。 因为新版本默认使用OpenSSL 3&#xff0c;它可能不再支持旧版的加密算法或配置。 > demo0.1.0 serve > vue-cli-service serveINFO Starting development server... 10% building 2/5 modules 3 active ...…

2024蓝桥A组D题

团建 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序难度等级 问题描述 格式输入 输入的第一行包含两个正整数n,m&#xff0c;用一个空格分隔。 第二行包含n个正整数c1,c2, ,cn&#xff0c;相邻整数之间使用一个空格分隔&#xff0c; 其中ci表示第一…

Python教程:备份你的文件夹里面的数据

1.完全备份是最基本的备份类型&#xff0c;它涉及复制所有选定的数据到备份位置。无论文件是否自上次备份以来发生了变化&#xff0c;所有文件都会被复制。这种备份方式简单直接&#xff0c;确保了备份存储的数据总是最新的。 完全备份是通过递归复制源文件夹中的所有文件和子…

简单了解C++常见编程问题解决方案

这篇文章主要介绍了C常见编程问题解决方案,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 电脑配置&#xff1a;window10, 64位操作系统&#xff0c;基于x64的处理器&#xff0c;Microsoft Visual Studio Comm…