我正在寻找这个stackoverflow question来回答Javascript。
因此,如果我的输入是" word",则该函数应返回:
字, 字, 字, 字, 字, 字, 等。
这里是我迄今为止所拥有的,但它只产生排列(不会把任何东西都搞砸)
var perm = function(str){
var results = [];
var combos = function(reference, appendTo){
appendTo = appendTo || "";
if(reference.length === 0) {
results.push(appendTo);
}
for(var i = 0; i < reference.length; i++){
var current = reference.splice(i, 1);
combos(reference, appendTo+current);
reference.splice(i, 0, current)
}
}
combos(str.split(""));
return results;
}
perm("word");
答案 0 :(得分:3)
就像使用二进制逻辑生成任何语言的排列一样简单。
作为下面代码段的一个简单示例,请考虑下表,其中左列是当前排列的二进制表示,右列是结果大写:
0000 | word
1000 | Word
0100 | wOrd
1100 | WOrd
...
1111 | WORD
// Used to display the results
const write = (msg) => {
document.body.appendChild(document.createElement('div')).innerHTML = msg;
};
const input = "word";
const letters = input.split("");
const permCount = 1 << input.length;
for (let perm = 0; perm < permCount; perm++) {
// Update the capitalization depending on the current permutation
letters.reduce((perm, letter, i) => {
letters[i] = (perm & 1) ? letter.toUpperCase() : letter.toLowerCase();
return perm >> 1;
}, perm);
const result = letters.join("");
write(result);
}
&#13;
答案 1 :(得分:1)
考虑到Nit的解决方案,我想提供一个稍微重构的解决方案,可能更容易理解
var perm = function(str){
var results = [];
var arr = str.split("");
var len = Math.pow(arr.length, 2);
for( var i = 0; i < len; i++ ){
for( var k= 0, j = i; k < arr.length; k++, j >>=1){
arr[k] = ( j & 1 ) ? arr[k].toUpperCase() : arr[k].toLowerCase();
}
var combo = arr.join("");
results.push(combo);
}
return results;
}
perm("word");
答案 2 :(得分:0)
var s = "word";
var sp = s.split("");
for (var i = 0, l = 1 << s.length; i < l; i++) {
for (var j = i, k = 0; j; j >>= 1, k++) {
sp[k] = (j & 1) ? sp[k].toUpperCase() : sp[k].toLowerCase();
}
var st = sp.join("");
var d = document.createElement("p");
d.appendChild(document.createTextNode(st));
document.body.appendChild(d);
}