演算法:回溯法(backtracking)解決尋找給定字串的所有排序(permutations)問題
阿新 • • 發佈:2021-02-16
技術標籤: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 ('')
}