1. 程式人生 > 其它 >演算法:回溯法(backtracking)解決尋找給定字串的所有排序(permutations)問題

演算法:回溯法(backtracking)解決尋找給定字串的所有排序(permutations)問題

技術標籤:algorithms演算法資料結構字串

字串的所有排序

列出給定字串的所有排序, 這個問題通常英文中被稱作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
('') }