题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
题目解析
- abc可以分解为以下形式
- 即:假设字符串的长度为n,则循环n次,每次将字符串的第n项拿出,与剩余字符串进行拼接
- 剩余字符串又可以进行同样的循环,满足递归算法
'abc'
=>'a' + 'bc' => 'a' + 'b' + 'c' || 'a' + 'c' + 'b'
=>'b' + 'ac' => 'b' + 'a' + 'c' || 'b' + 'c' + 'a'
=>'c' + 'ab' => 'c' + 'a' + 'b' || 'c' + 'b' + 'a'
递归算法
function Permutation(str)
{
// 所有结果集合
let result = [];
// 如果输入空字符串,则返回空数组
if (str.length == 0) return [];
// 如果输入一个字符,则返回数组,内容唯一且为输入字符
if (str.length == 1) return [str];
// 遍历字符串
for (let i = 0; i < str.length; i++) {
// 字符串第n项
let item = str[i];
// 字符串除第n项外其余项
let reStr = str.slice(0, i) + str.slice(i + 1, str.length);
// 对剩余项进行排列后的所有集合
let remaining = Permutation(ReStr);
// 遍历对剩余项进行排列后的所有集合
for (let j = 0; j < remaining.length; j++) {
// 字符串第n项与剩余项进行排列后的所有集合中第j项进行拼接
let tmp = item + remaining[j];
// 如果集合中不存在此项,则将此项扔进数组(去重)
if(result.indexOf(tmp)==-1) result.push(tmp);
}
}
return result;
}