把一个字符串重新排列为新的字符串,同时去除相同的排列组合
这个算法其实我们都不陌生,就是中学学习的排列组合。
用程序语言来实现的话,就需要用到递归。
在本算法中,根据传入字符串的长度,我们要对其进行相应的递归次数
如"abc",按照排列组合,我们首先应该分别把"a","b","c"作为首个字符,然后分别对剩下的两个字符进行排列,由此我们可以利用递归来实现这个逻辑。
function getPermutations(str){
//声明递归内部使用的局部变量
var permutations = [], //用于存储新组合成的字符串的数组
nextWord = [], //用于储存下一个拼接的字符
chars = [] //用于储存不同阶段的递归调用的参数
;
//---------------------
//将传进来的字符串或者数字转换为数组
if (typeof str === 'string') chars = str.split('');
else if (typeof str === 'number') {
str = str + "";
chars = str.split('');
}
//============主要执行语句========
permutate(chars);
return permutations.filter(function(val,index,array){
return array.indexOf(val)===index;
});
//===========递归函数声明===========
function permutate(chars){ //递归函数:生成新的排列
if(chars.length === 0)permutations.push(nextWord.join(''));
for (var i=0; i < chars.length; i++){
chars.push(chars.shift()); //首尾交换
nextWord.push(chars[0]); //把第一个字符压入数组
permutate(chars.slice(1)); //递归调用,每次递归都比之前少一个字符
nextWord.pop(); //清除之前压入数组的字符
}
}
//--------------------------------
}
参考资料: