一、目標:
把一個字符串中的字符重新排列生成新的字符串,例如, abc 總共有6種排列 (abc, acb, bac, bca, cab, cba)。
二、思路:
本文章只研究全排列的情況,比如,還是 abc 字符串,3個字符,則總共的排列組合方式應該有 n! 種,此處的 n 為3,則計算出來應該是6種。本文采用遞歸方式實現,基本思路是通過雙循環來實現遞歸的主邏輯部分,外層循環 str,內層循環 n - 1 時的返回數組 preResult 部分,算法邏輯如下方流程圖。
首先,考慮遞歸如何產生,假如當 n = 1,即傳參 str 的長度只有1時,則直接返回只有 str 的數組;當 n > 1時,則考慮 n 和 n - 1 方法返回數組的關系。可以想到,n 時多出的一個字符,來添加到 n - 1 返回數組中每個字符串的頭部。
三、代碼
// perm function
var perm = function(s) {
var result = [];
if (s.length <= 1) {
return [s];
} else {
for (var i = 0; i < s.length; i++) {
var c = s[i];
var newStr = s.slice(0, i) + s.slice(i + 1, s.length);
var l = perm(newStr);
for (var j = 0; j < l.length; j++) {
var tmp = c + l[j];
result.push(tmp);
}
}
}
return result;
};