leetcode面试题0808有重复字符串的排列组合

描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。

例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

数据范围:n<10
要求:空间复杂度 O(n!),时间复杂度 O(n!)

输入描述:

输入一个字符串,长度不超过10,字符只包括大小写字母。

示例1

输入:"ab"

返回值:["ab","ba"]

说明:返回["ba","ab"]也是正确的

示例2

输入:"aab"

返回值:["aab","aba","baa"]

示例3

输入:"abc"

返回值:["abc","acb","bac","bca","cab","cba"]

示例4

输入:""

返回值:[""]

思路

 这道题就是一个组合,但是要排除重复项。如果直接使用循环,好像并不好下手。

 如果我们使用递归的思想,把字符串abc看作a和[bc]的组合。我们不用关心[bc]组合到底是什么样子,我们最终得到以a开头的组合就是a+[bc]。以b开头的组合b+[ac],以c开头的组合c+[ab]。

 在计算以a开头的组合中,我们还需要判断如果[bc]中有以a开头的字符。比如aab这种用例的情况,a+[ab],后面进行遍历的时候,我们就不再统计a,直接统计b+[aa]。所以最终结果就是aab aba,baa。

    大致思路其实已经出来了,伪代码如下:

permutation(abc) {list = [];set = [];for(a,b,c):if(!set.contains(a)){sublist = permutation(bc)for(String str: sublist):list.add(a+str)set.add(a);}return list;
}

    在上面aab的例子中,我们开始遍历a的时候,我们需要知道[ab]有多少种组合,这样,结果就是a + list([ab]) ,继续拆分ab,这时候就是a+list([b])。当只有一个字母的时候,组合就是一种情况,递归终止。当进行下一次遍历的时候,发现如果是a,那么不用遍历,因为a已经计算过。最后遍历到b,这时候就是b+list([aa]),继续拆分aa,同样是一种情况,最终遍历结束,返回所有的情况。

    同理,abc的时候,我们遍历a,我们需要知道剩下的[bc]的组合情况,继续拆分b+[c]。拆到只剩一个字母的时候,递归结束。接着遍历b、c。为了求出剩下的字符有多少种组合,我们继续拆分,也就是递归,直到剩下一个字母,这时候就是一种情况,递归结束。

    代码

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {System.out.println(Permutation(scanner.next()));}scanner.close();}public static ArrayList<String> Permutation(String str) {ArrayList<String> list = new ArrayList<>();if (str.length() == 1) {list.add(str);} else {Set<String> set = new HashSet<>();for (int i = 0; i < str.length(); i++) {String left = str.substring(i, i + 1);if (!set.contains(left)) {String substr = str.substring(0, i) + str.substring(i + 1);List<String> subList = Permutation(substr);for (int j = 0; j < subList.size(); j++) {list.add(left + subList.get(j));}set.add(left);}}}return list;}
}

    运行测试用例:

    这道题采用了递归的思想,把字符串拆分为首字母和剩下的子串,这种组合就是首字母和子串列表的组合。 为了求得子串有多少种组合,继续拆分,直到拆分到剩下一个字符串,这时候就是一种情况,拆分结束。当然,字符串有可能会有字母重复,我们在遍历的时候,记录是否已经遍历过当前首字母。

    还有一种比较孬的办法,这里不用考虑重复,把所有可能的情况都添加进来,最后把结果放到Set集合中,让它自己去重,虽然也能得到结果,但是时间复杂度不一定能满足算法要求。

    而本例的方法是通过了算法测试要求的:

    这种使用递归的办法,我们不需要知道每一种组合到底有多少种,我们只需要根据我们的思路去把字符串拆分成更小的单元,到了一个字母组成的字符串的时候,我们就很明确地知道这种组合情况,递归结束。 

  最后附上牛客网该题的地址:https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

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

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

相关文章

引领初创企业的数字化转型:选择适合的低代码平台

初创企业在初期各项架构都还不完善&#xff0c;对于应用程序的需求多样&#xff0c;但是又要考量成本。所以&#xff0c;低代码平台就是在综合考量成本和需求的情况下的一个突出的选择。下面我们就六个方面为您介绍&#xff1a;初创企业选择的Zoho Creator低代码平台。 1、功能…

机器学习笔记 - k-NN算法的数学表达

一、概述 所有的机器学习算法都是有假设前提的。k-NN算法的假设前提是相似的输入有相似的输出。其分类规则是对于测试输入x,在其k个最相似的训练输入中分配最常见的标签。 k-NN 的正式定义: 对于一个待测试数据。 将的个最近邻的集合表示为 。的正式定义为 ,并且。(意思就是…

mmdetection v3避坑

命令&#xff1a; python tools/test.py projects/DiffusionDet/configs/diffusiondet_r50_fpn_500-proposals_1-step_crop-ms-480-800-450k_coco.py /data/zhangrui/mmdetection-master/checkpoints/diffusiondet_r50_fpn_500-proposals_1-step_crop-ms-480-800-450k_coco_202…

云计算的发展趋势和挑战

本文将探讨云计算的发展趋势和挑战&#xff0c;旨在帮助读者了解云计算的最新动态和未来发展方向。 随着信息技术的发展&#xff0c;云计算作为一种新兴的计算模式&#xff0c;已经得到了广泛的应用和认可。它通过将计算资源、存储资源和应用程序等服务通过互联网提供给用户&a…

华为OD机试真题- 阿里巴巴找黄金宝箱(IV)-2023年OD统一考试(B卷)

题目描述: 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子排列成一个环,编号最大的箱子的下一个是编号为0的箱子。 请输出每个箱子贴的数字之后的第一个比它大的数,如果不存在则输出-1。 …

Linux第一次作业

一&#xff0c;作业问题&#xff1a; 二&#xff0c;问题解答&#xff1a; 1. 2.文件管理命令练习 3.vi/vim练习 3.1 3.2 3.3 3.4

产品文档-BRD、MRD和PRD

1、BRD&#xff08;Business Requirement Document&#xff09;&#xff0c;商业需求文档&#xff0c;是一份产品商业论证报告&#xff0c;基于商业目标或价值所描述的产品需求内容文档&#xff0c;是领导层进行产品研发立项决策评估的重要依据&#xff0c;是产品生命周期中最早…

消除达人游戏小程序开发流程:专业性与创新的结合

在移动互联网时代&#xff0c;达人游戏小程序逐渐成为了用户追逐娱乐的一种方式。为了满足用户对于达人游戏的需求&#xff0c;开发一款专业且具有创新性的达人游戏小程序显得尤为重要。本文将从需求分析、技术选型、系统设计和用户体验等多个方面&#xff0c;深入探讨达人游戏…

题目 1062: 二级C语言-公约公倍

输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数。样例输入 2 3样例输出 1 6 这题一知半解的&#xff0c; 最小公倍数两数の积/最大公约数&#xff1b; 最大公约数通过迭代法求得(见其下)&#xff0c; 作为a,b两数有一个属为有一个为0为无效数据时 《-----a%b等…

2023.9.23-最强实战:Typora+mkdocs构建自己的知识库博客

最强实战&#xff1a;Typoramkdocs构建自己的知识库&博客-2023.9.23 winodws-ecs-rsync-mkdocs-typora-百度网盘同步空间数据维护方案 目录 实验环境 win10 typora v1.7.4 mkdocs, version 1.5.2 vscode v1.82.2 阿里云轻量服务器实验软件 链接&#xff1a;https://pan.…

sh文件介绍及linux下执行

Shell脚本是一种用于自动化任务和系统管理的脚本语言。它允许用户通过命令行界面执行一系列命令&#xff0c;从而简化了重复性任务的处理过程。 以下是关于Shell脚本的一些基本概念&#xff1a; 1. Shell脚本通常以“.sh”扩展名保存&#xff0c;例如“script.sh”。 2. Shell…

算法 旋转数组最小数字-(二分查找+反向双指针)

牛客网: BM21 题目: 非降数组旋转后的最小值 思路: 数组形状呈现从小到大&#xff0c;再从小到大&#xff0c;左半段的值均大于右半段的值&#xff0c;需找到中间的最小值。初始化双指针left 0, right n-1, mid left (right-left)/2, 如果nums[mid] < nums[right],说明…

单片机论文参考:3、基于单片机的电子万年历设计

摘要 随着社会、科技的发展&#xff0c;人类得知时间&#xff0c;从观太阳、摆钟到现在电子钟&#xff0c;不断研究、创新。为了在观测时间&#xff0c;能够了解与人类密切相关的信息&#xff0c;比如星期、日期等&#xff0c;电子时钟诞生了&#xff0c;它集时间、日期、星期等…

005:vue2使用vue-type-writer实现打字机效果

Vue Type Writer是一个Vue.js 2打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。 文章目录 1. 效果2. 安装使用 1. 效果 2. 安装使用 npm 安装 npm install vue-type-writer --save完整代码 <template><div class"app-container home"><…

2023.9.11 关于传输层协议 UDP和TCP 详解

目录 UDP协议 TCP协议 TCP十大核心机制 确认应答 超时重传 连接管理&#xff08;三次握手 四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP 中的异常处理 经典面试题 对比 TCP 和 UDP 如何使用 UDP 实现可靠传…

Spring面试题15:Spring支持几种bean的作用域?singleton、prototype、request的区别是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持几种bean的作用域? Spring支持以下几种Bean的作用域: Singleton(单例):这是Spring默认的作用域。使用@Scope(“singleton”)注解或…

【观察】数字化转型的“下半场”,华为加速行业智能化升级

过去几年数字化转型席卷全球&#xff0c;随着新技术的广泛应用&#xff0c;新的机会和价值正在不断被发现和创造。从某种程度上说&#xff0c;数字化转型不再是“可选项”&#xff0c;而变成了“必选项”。 目前&#xff0c;已经有超过170多个国家和地区制定了各自的数字化相关…

Spring面试题17:Spring中什么是bean装配?有哪几种自动装配方式?自动装配有哪些局限性?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring中什么是bean装配? 在Spring中,Bean装配是指将一个或多个Bean实例化、配置和组合在一起的过程。它是Spring容器的核心功能之一,通过Bean装…

如何搭建专属的物联网私有云?需要考虑哪些因素?

随着物联网技术的快速发展&#xff0c;越来越多的企业开始意识到搭建专属的物联网私有云的重要性。私有云是指企业自主建设和管理的云服务环境&#xff0c;其中企业可以实现对数据和服务的全面控制&#xff0c;同时也可以享受云服务的高效性和灵活性。 一、企业做专属物联网私…