繁体   English   中英

在 Javascript 中查找字符串的所有小写和大写组合

[英]Find all lowercase and uppercase combinations of a string in Javascript

我正在寻找要在 Javascript 中回答的这个stackoverflow 问题

所以如果我的输入是“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");

一种选择是通过二进制逻辑生成大写排列。

作为下面代码片段的一个简单示例,请考虑下表,其中左列是当前排列的二进制表示,右列是结果大写:

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

请注意,理论上这种方法可以一直工作到Number.MAX_SAFE_INTEGER ,直到输入长度为 52,但实际上您会遇到性能问题。

考虑到 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");

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

// NOT AN ANWSER JUST WANT TO RUN CODE ON CHROMEBOOK

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM