当前位置: 首页 > news >正文

算法:回溯法(backtracking)解决寻找给定字符串的所有排序(permutations)问题

字符串的所有排序

列出给定字符串的所有排序, 这个问题通常英文中被称作permutations(排列,排序)
而使用的方法为回溯法(backtracking)

具体的操作为:

将字符串的每一位都与字符串中包括自己的每一位进行交换(swap), 直到没有可与之交换的字符的时候, 输出当前的字符串, 并且返回到上一个节点,尝试交换下一个可能的字符. 直到所有的叶节点都被输出, 即得到所有可能的排序.

用可视化来看回溯的解决步骤:
回溯法

整个查找最终output的过程可以看作是一棵树往下延伸的过程,这棵树最终的所有叶子节点才是我们关心的输出. 在理解完回溯的过程之后, 代码就呼之欲出了. 这里提供js版本的找出所有排序的算法:

/**
 * @param {string} s
 */
var permutations = function(s) {
  const length = s.length
  backtracking(s, 0, length - 1)
}

var backtracking = function(s, l, r) {
  // 当i和j相同,说明除了自身以外已没有可调换数字,直接输出当前字符串
  if (i === j) {
    console.log(s)
  } else { // 否则,继续构造回溯树
    for (let i = l; i <= r; i++) {
      s = swap(s, l, i)
      backtracking(s, l + 1, r)
      // 把s还原成swap之前的字符串,准备交换下一个字符
      s = swap(s, l, i)
    }
  }
}

// 将字符串a的i和j字符调换位置
var swap = function(a, i, j) {
  var charArray = a.split('')
  var tempChar = charArray[i]
  charArray[i] = charArray[j]
  charArray[j] = tempChar
  return charArray.join('')
}

相关文章:

  • 算法: 动态规划 寻找2D矩阵中到达某一坐标的最小代价路径
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障)
  • 算法: 动态规划,二维矩阵代价最值进阶版 两条行进路径,一次相交,求解最大代价
  • Programming Languages And Lambda calculi 1.1 定义集合
  • 算法: 动态规划 编辑距离 Edit Distance / Levenshtein Distance
  • 【Salesforce】【Apex】Trigger中不通过soql查询记录类型的开发名称
  • 【Programming Languages And Lambda calculi】 1.2 ~ 1.3 关系、赋值与关系
  • 【Programming Languages And Lambda calculi】 1.4 有向赋值
  • 【算法】 动态规划 基础题库 1-7 python实现
  • 【Programming Languages And Lambda calculi】 1.5 ~ 1.7 上下文规约 赋值函数 符号摘要
  • 【Programming Languages And Lambda calculi】第二章 结构归纳法 2.1 基础
  • 【Programming Languages And Lambda calculi】2.2 ~ 2.3 定义中的省略,证明树中的归纳
  • 【Programming Languages And Lambda calculi】2.4 ~ 2.5 多重结构,更多的定义与证明 第二章结束
  • 【Programming Languages And Lambda calculi】第三章 求值一致性 Church-Rosser 关系 (本章仅一节)
  • php的引用
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 345-反转字符串中的元音字母
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • FastReport在线报表设计器工作原理
  • Go 语言编译器的 //go: 详解
  • idea + plantuml 画流程图
  • JavaScript服务器推送技术之 WebSocket
  • Js基础知识(四) - js运行原理与机制
  • js中的正则表达式入门
  • spark本地环境的搭建到运行第一个spark程序
  • SpiderData 2019年2月23日 DApp数据排行榜
  • Spring声明式事务管理之一:五大属性分析
  • VUE es6技巧写法(持续更新中~~~)
  • 半理解系列--Promise的进化史
  • 闭包--闭包作用之保存(一)
  • 免费小说阅读小程序
  • 我的业余项目总结
  • 学习笔记:对象,原型和继承(1)
  • 容器镜像
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #define,static,const,三种常量的区别
  • #QT(串口助手-界面)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (4.10~4.16)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)计算机毕业设计高校学生选课系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 4.0中的泛型协变和反变
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 2.1路线图
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 分布式技术比较
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C++]类和对象(中)
  • [C++]指针与结构体