《剑指offer》— JavaScript(27)字符串的排列
字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路
- 递归思想:把大问题转换为若干小问题;
- n个元素的全排列 = (n-1) 个元素全排列 + 一个元素作为前缀。
- 递归的出口:只有一个元素的全排列,此时排序完成,输出数组。
- 遍历字符串,将每个字符放在第一个元素作为前缀,并将其余元素继续全排列。
- 新建一个isRepeat空对象,用来判断字符是否重复,若重复则跳过排序。
实现代码
function Permutation(str) { var result = []; if (str.length <= 0) { return []; } var sortTemp= ""; var arr = str.split(""); result = sortString(arr, sortTemp, []); return result; } function sortString(arr, sortTemp, res) { if (arr.length == 0) { res.push(sortTemp); } else { var isRepeat = {}; for (var i = 0; i < arr.length; i++) { if (!isRepeat[arr[i]]) { var temp = arr.splice(i, 1)[0]; // 取出第i个字符 sortTemp+= temp; // 第i个字符设为前缀 sortString(arr, sortTemp, res); arr.splice(i, 0, temp); // 补全取出的元素,恢复原字符串 sortTemp= sortTemp.slice(0, sortTemp.length - 1); // 清空sortTemp isRepeat[temp] = true; } } } return res; }