2015-01-16 48 views
-2

我在尋找這個stackoverflow question以Javascript解答。在Javascript中查找字符串的所有小寫和大寫組合

所以,如果我輸入的是 「字」,該函數將返回:

字, 字, 字, 字, 字, 字, 等。

這裏就是我到目前爲止,但它只產生排列(不會大寫任何東西)

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

那麼,你的代碼?我看不到任何評論。 –

+0

我將繼續並將其作爲「工單」關閉。如果這是一個疑難解答問題,請向我們展示您迄今的工作,並描述您解決問題的難度。 –

+0

就像你知道的,製作百萬個隨機的大小寫版本,然後過濾重複的文件 – dandavis

回答

2

它就像生成permutatio ns以任何語言與二進制邏輯。

如下面的代碼段的一個簡單的例子,考慮下面的表,其中左邊的列是當前排列的二進制表示和右列是所得大寫:

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); 
 
}

+0

謝謝你的工作。你能解釋第二個for循環是如何工作的嗎?具體來說,我想知道它是如何擺脫循環,我不是用這種方式來看循環。 – user3068590

+0

使用'for(...; j; ...)'相當於'for(...; j!== 0; ...)'。請注意上述代碼中分號的位置。我們在內部循環中初始化兩個變量,然後檢查條件,然後在每次迭代中執行兩個操作。雖然它不是簡潔的風格,但如果你熟悉二進制排列的概念,那麼它是非常直接的。 – Nit

+0

現在有道理,謝謝! – user3068590

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"); 
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); 
 
}

相關問題