【问题标题】:Find all lowercase and uppercase combinations of a string in Javascript在Javascript中查找字符串的所有小写和大写组合
【发布时间】:2015-03-15 13:04:08
【问题描述】:

我正在寻找这个stackoverflow question 用 Ja​​vascript 来回答。

所以如果我的输入是“单词”,函数应该返回:

单词, 单词, 单词, 单词, 单词, 单词, 等等。

这是我目前所拥有的,但它只产生排列(不大写任何东西)

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

【问题讨论】:

  • 那么你的代码呢?我看不到任何可评论的内容。
  • 我将继续将此作为“工单”关闭。如果这是一个故障排除问题,请向我们展示您目前所做的工作,并描述您在解决问题时遇到的困难。
  • 就像,你知道,制作一百万个随机大小写版本,然后过滤重复项
  • @dandavis:实际的解决方案比这更……专注。
  • @RobertHarvey:我的回答和这个问题一样集中在 SO...

标签: javascript permutation uppercase lowercase


【解决方案1】:

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

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

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,但实际上您会遇到性能问题。

【讨论】:

  • 感谢这很好用。你能解释一下第二个 for 循环是如何工作的吗?具体来说,我想知道它是如何跳出循环的,我不习惯看到这样写的 for 循环。
  • 使用for(...; j; ...) 等价于for(...; j !== 0; ...)。注意上面代码中分号的位置。我们在内循环中初始化两个变量,然后检查条件,然后在每次迭代中执行两个操作。虽然它在样式方面并不干净,但如果您熟悉二进制排列的概念,它就相当简单了。
  • 如果“单词”的排列但只有 2 个字符是大写的怎么办?
  • @Roi 您可以在上面的代码中添加一些额外的检查以只保留您想要的那些,或者编写一个稍微不同的方法,它只生成带有 2 个大写字符的组合。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多