JavaScript趣题:全排列去重
2016-12-03 10:38
381 查看
给定一个字符串,将它所有的全排列结果以数组的形式展示,要求没有重复的结果。
举个例子:
我有字符串”aabb”,它的全排列结果应该有4*3*2*1=24种,但是考虑到要求为没有重复,所以结果为6种,如下所示:
['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa']
所以问题的关键在于2个方面:
1.如何求全排列
2.如何对结果去重
求全排列,既可以用递归,也可以用非递归方法。
去重可以使用一个hash来达到目的。
//递归求解全排列
function permutations(string) {
//用于存放去重结果的hash
var hash = {};
//遍历函数
//from:要遍历的字符数组
//to:记录路径的字符数组
var traverse = function(from,to){
//若当前深度没有达到叶子
if(to.length < string.length){
for(var i=0;i<from.length;i++){
var newFrom = from.slice(0);
var one = newFrom.splice(i,1);
var newTo = to.slice(0);
newTo = newTo.concat(one);
traverse(newFrom,newTo);
}
}
else{
//作为key存入hash
hash[to.join("")] = null;
}
};
traverse(string.split(""),[]);
//提取hash的key作为数组返回
return Object.keys(hash);
}
举个例子:
我有字符串”aabb”,它的全排列结果应该有4*3*2*1=24种,但是考虑到要求为没有重复,所以结果为6种,如下所示:
['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa']
所以问题的关键在于2个方面:
1.如何求全排列
2.如何对结果去重
求全排列,既可以用递归,也可以用非递归方法。
去重可以使用一个hash来达到目的。
//递归求解全排列
function permutations(string) {
//用于存放去重结果的hash
var hash = {};
//遍历函数
//from:要遍历的字符数组
//to:记录路径的字符数组
var traverse = function(from,to){
//若当前深度没有达到叶子
if(to.length < string.length){
for(var i=0;i<from.length;i++){
var newFrom = from.slice(0);
var one = newFrom.splice(i,1);
var newTo = to.slice(0);
newTo = newTo.concat(one);
traverse(newFrom,newTo);
}
}
else{
//作为key存入hash
hash[to.join("")] = null;
}
};
traverse(string.split(""),[]);
//提取hash的key作为数组返回
return Object.keys(hash);
}
相关文章推荐
- JavaScript趣题:质数之差
- JavaScript趣题:排列组合实战
- JavaScript实现穷举排列(permutation)算法谜题解答
- JavaScript趣题:迷路的牛仔
- javascript-按圆形排列DIV元素(一)---- 分析
- JavaScript之jQuery-5 jQuery 动画效果(隐藏和显示、自定义动画、并发与排列效果)
- 全排列算法 --javascript 实现
- JavaScript 排列组合算法 1、2、3、4、5、6、7 任意的排列组合不重复的 个数
- JavaScript计算N个点均匀排列成圆的各个点坐标
- JavaScript趣题:求解最大子数组之和
- 训练趣题:黑与白 有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。(此处用javascript实现)
- 趣题:对数字进行编码使其按字典序排列后仍然有序
- JavaScript趣题:有序列表
- JavaScript趣题:大整数字符串相加
- JavaScript趣题:统计二进制
- javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- JavaScript趣题:字符串排序
- javascript 字符串的排列与组合
- JavaScript趣题:统计降水量
- JavaScript趣题:得到了奖金嘛?