算法:回溯法(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('')
}

猜你喜欢

转载自blog.csdn.net/qq_35714301/article/details/113503468
今日推荐