博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(27)字符串的排列
阅读量:4557 次
发布时间:2019-06-08

本文共 1704 字,大约阅读时间需要 5 分钟。

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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) {    let s = '';    for (let i = 0; i < arr.length; i++) {      s += arr[i];    }    return res.push(s);  }  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;}

 

转载于:https://www.cnblogs.com/wuguanglin/p/Permutation.html

你可能感兴趣的文章
WPF自定义控件之扩展原生控件
查看>>
《区块链100问》笔记整理——42~49问
查看>>
使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享
查看>>
深入理解计算机系统(1.4)---并发与并行、浅谈抽象
查看>>
函数依赖的公理化系统
查看>>
rabbitmq学习(四):利用rabbitmq实现远程rpc调用
查看>>
侯捷C++学习(二)
查看>>
EasyPlayer RTSP Android安卓播放器修复播放画面卡在第一帧bug
查看>>
web项目中全局常量的添加
查看>>
搬运工程 启动!
查看>>
局部加权回归(LWR) Matlab模板
查看>>
Connect to the DSP on C6A8168/DM8168/DM8148 using CCS
查看>>
hibernate在使用getCurrentSession时提示no session found for current thread
查看>>
【Luogu1471】方差(线段树)
查看>>
【agc028E】High Elements(动态规划,线段树,贪心)
查看>>
DEV中svg图标的使用
查看>>
Codefroces Gym101572 I.Import Spaghetti-有向图跑最小环输出路径(Floyd)
查看>>
有关位运算的操作+二进制状态压缩
查看>>
Eclipse插件 -- 阿里巴巴扫描编码规插件
查看>>
(1.1)学习笔记之mysql体系结构(内存、进程、线程)
查看>>