剑指offer[27]——字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
这道题目我们换一种思路,假设题目中给的字符串全部是不重复字母,然后题目要求我们给出字符串排列的种数,这个时候大家心里应该能够想到使用排列组合的方法来解决这道题目。
首先,我们把四个字母的位置当做是四个杯子,假设四个字母是ABCD,第一个杯子放置字母的可能性有四种(A,B,C,D),第二个杯子有三种,因为第一个杯子已经确定了有一个字母,所以给第二个杯子三种选择,依次类推,第三个杯子有两种,第四个杯子有一种
4∗3∗2∗1=24
所以一共有24种可能性。但是题目中要求我们给出具体的排列,并且字符串中可能有重复的字母,大家能够懂以上排列组合的方式,我们就按照这个方式来给出具体的字母排列。
举例说明,假设题目中给的字符串是ABCD,我们可以采用第一个字母分别于四个位置的字母想交换的方式得出第一个位置的字母:
ABCD,BACD,CBAD,DBCA
如上我们得出了四种,接下来我们需要考虑第二个位置的字母是什么,由于种类过多,此处仅用ABCD举例(余下的三种同理):
ABCD,ACBD,ADCB
如上我们得出了三种,接下来再决定第四个位置的字母是什么,原因如上,我们仅用ABCD举例:
ABCD,ABDC
如上我们得出了两种,再接下来我们就没有看的必要了,第四个位置就只有一种可能。
大家如果看懂上面的推导,接下来的代码部分应该是可以看懂了
function Permutation(str)
{
// 判空操作
if(str.length==0){return [];}
const letters = str.split('');
let res = [];
function perm(list, start){
if(start === letters.length-1){
const str = list.join('');
// 有可能会有重复字母,所以做查重处理
if(!res.includes(str)){
res.push(str);
}
}
for(let i=start; i<list.length; i++){
[list[i], list[start]] = [list[start], list[i]];
perm(list, start+1);
// 还原原有列表排序,以免影响后续计算
[list[i], list[start]] = [list[start], list[i]];
}
}
perm(letters, 0);
// 按照字典序排序输出
return res.sort((a,b)=>{return a>b?1:-1});
}
作者:Jacob是我了
出处:https://www.cnblogs.com/Jacob98/p/12535464.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
剑指 offer
标签:
JavaScript
, 算法
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件