题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

题目分析

这题还算可以,关于全排列,有两种解法,第一种就是递归全排列法,第二种就是回溯法。

递归全排列法:

就是剑指offer上的做法,也比较容易理解,不过挺少人答的也就是

    1. 把字符串分为两部分:第一部分为第一个字符,第二部分为第一个字符以后的字符串。
    2. 然后接下来求后面那部分的全排列。
    3. 再将第一个字符与后面的那部分字符逐个交换

回溯法
也就是利用树去尝试不同的可能性,不断地去字符串数组里面拿一个字符出来拼接字符串,当字符串数组被拿空时,就把结果添加进结果数组里,然后回溯上一层。(通过往数组加回去字符以及拼接的字符串减少一个来回溯。)

代码

回溯法:

// 回溯法
function Permutation(str) {
let res = [];
const pStr = '';
if (str.length <= 0) return res;
arr = str.split(''); // 将字符串转化为字符数组
res = permutate(arr, pStr, res);
return res;
}
function permutate(arr, pStr, res) {
if (arr.length === 0) {
return res.push(pStr);
}
const isRepeated = new Set();
for (let i = 0; i < arr.length; i++) {
if (!isRepeated.has(arr[i])) {
// 避免相同的字符交换
const char = arr.splice(i, 1)[0];
pStr += char;
permutate(arr, pStr, res);
arr.splice(i, 0, char); // 恢复字符串,回溯
pStr = pStr.slice(0, pStr.length - 1); // 回溯
isRepeated.add(char);
}
} return res;
}

递归全排列法:

// 递归全排列法
function Permutation2(str) {
let res = [];
if (str.length <= 0) return res;
arr = str.split(''); // 将字符串转化为字符数组
res = permutate2(arr, 0, res);
res = [...new Set(res)]; // 去重
res.sort(); // 排序
return res;
}
function permutate2(arr, index, res) {
if (arr.length === index) {
   return res.push(arr.join(''));
}
for (let i = index; i < arr.length; i++) {
[arr[index], arr[i]] = [arr[i], arr[index]]; // 交换
permutate2(arr, index + 1, res);
[arr[index], arr[i]] = [arr[i], arr[index]]; // 交换
} return res;
}

剑指offer(27)字符串的排列的更多相关文章

  1. 剑指Offer 27. 字符串的排列 (字符串)

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  2. [剑指Offer] 27.字符串的排列

    [思路]从第一位开始,判断每一位字符的所有可能性,依此递归. class Solution { public: void PermutationHelp(vector<string> &a ...

  3. 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

    剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...

  4. 剑指 Offer 38. 字符串的排列

    剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" ...

  5. 【剑指Offer】字符串的排列 解题报告(Python)

    [剑指Offer]字符串的排列 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  6. 【Java】 剑指offer(38) 字符串的排列

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串ab ...

  7. Go语言实现:【剑指offer】字符串的排列

    该题目来源于牛客网<剑指offer>专题. 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,b ...

  8. 《剑指offer》字符串的排列

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  9. 剑指offer:字符串的排列

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...

  10. 剑指OFFER之字符串的排列(九度OJ1369)

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...

随机推荐

  1. [VS SVN] VS的SVN插件AnkhSvn

    VS的SVN插件AnkhSvn   修改VS配置  将解决方案或项目加入SVN管理

  2. kaggle竞赛-保险转化-homesite

    时间格式的转化 查看数据类型 查看DataFrame的详细信息 填充缺失值 category 数据类型转化 模型参数设定 结论 该项目是针对kaggle中的homesite进行的算法预测,使用xgbo ...

  3. Solve Docker for Windows error: docker detected, A firewall is blocking file Sharing between Windows and the containers

    被这个“分享硬盘”问题烦了我好几个小时,终于在一个叫Marco Mansi外国人博客上找到解决方法了,真的很无奈 https://blog.olandese.nl/2017/05/03/solve-d ...

  4. 安装 docker

    Image 仓库 配置国内镜像源 windows下载 Docker Desktop centos 安装 Docker yum install docker -y service docker star ...

  5. 通俗bandit算法

    [原文链接] 选择是一个技术活 著名鸡汤学家沃.滋基硕德曾说过:选择比努力重要. 我们会遇到很多选择的场景.上哪个大学,学什么专业,去哪家公司,中午吃什么,等等.这些事情,都让选择困难症的我们头很大. ...

  6. Spring-Boot之Redis基础

    Spring-Boot之Redis基础 准备 Redis下载地址:github.com/MSOpenTech/redis/releases Redis数据库的默认端口号是 6379 开启Redis服务 ...

  7. vue 拍照上传图片 demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. HTML、CSS知识点,面试开发都会需要--No.5 文章段落

    No.5 文章段落 1.文字属性 文字属性包含font-*和text-*两类. 2.基于font的属性 (1)font-family:字体属性,多个字体之前用逗号隔开.如果第一个字体没找到,则依次找后 ...

  9. 斑马打印机ZT410中文打印

    ^XA ^CW1, E:SIMSUN.TTF^CI28^FO50,50^A1N,50,50^FD汉字^FS^XZ ******************************************* ...

  10. shell脚本----周期压缩备份日志文件

    一.日志文件样式 二.目标 1.备份压缩.log结尾&&时间样式为“date +%Y%m%d”的日志文件(如:20170912.20160311等) 2.可指定压缩范围(N天前至当天) ...