【问题标题】:Javascript for Variations with Repetition (combinatorics) of missing string characters缺少字符串字符的重复(组合)变体的Javascript
【发布时间】:2013-03-13 01:13:03
【问题描述】:

我的问题类似于尚未回答的THIS 问题。

我怎样才能使我的代码(或任何可能建议的 javascript 代码?)找到已知字符串长度的所有可能的解决方案,其中多个缺失字符随着重复而变化?

我正在尝试获取已知字符长度的字符串并从该字符串中查找缺失的字符。例如:

var missing_string = "ov!rf!ow"; //where "!" are the missing characters

我希望运行具有特定数组的脚本,例如:

var r = new Array("A","B","C","D","E","F","G","H","I","J","K",
                  "L","M","N","O","P","Q","R","S","T","U","V",
                  "W","X","Y","Z",0,1,2,3,4,5,6,7,8,9);

找到所有可能的变化,重复这些缺失的字符以获得结果:

ovArfAow
ovBrfAow
ovCrfAow
...
ovBrfBow
ovBrfCow
...
etc //ignore the case insensitive, just to emphasize the example

当然,最终在所有重复的变化中找到 ovErfLow

我已经能够使用 1 个(单个)缺失字符使其工作。但是,当我在我的代码中添加 2 个缺失字符时,它显然会为这两个缺失字符重复相同的数组字符,这对于重复来说非常有用,但我还需要找到不重复的字符,并且可能还需要 3-4 个缺失字符可能会或可能不会重复。这是我目前所拥有的:

var r = new Array("A","B","C","D","E","F","G","H","I","J","K",
                  "L","M","N","O","P","Q","R","S","T","U","V",
                  "W","X","Y","Z",0,1,2,3,4,5,6,7,8,9);
var missing_string = "he!!ow!r!d";
var bt_lng = missing_string.length;
var bruted="";

for (z=0; z<r.length; z++) {
for(var x=0;x<bt_lng;x++){
    for(var y=0;y<r.length;y++){
        if(missing_string.charAt(x) == "!"){
            bruted += r[z];
            break;
        }
        else if(missing_string.charAt(x) == r[y]){
            bruted += r[y];
        }
    }
}
console.log("br: " + bruted);
bruted="";
}

只需一个“!”就可以很好地工作:

helloworAd
helloworBd
helloworCd
...
helloworLd

但是有 2 个或更多“!”,我得到:

heAAowArAd
heBBowBrBd
heCCowCrCd
...
heLLowLrLd

这对重复部分有好处,但我还需要在每个缺失的字符点测试所有可能的数组 M 个字符。

【问题讨论】:

  • 你好像忘了问一个问题。您对这具体部分有什么问题? (“全部”或“开始工作”不是我问题的合适答案。) 一个建议:问问自己,你将如何手动用铅笔和纸来做这件事。以两个缺失的字母开头。
  • 我的问题是如何使我的代码(或可能建议的类似代码?)与重复变化的多个缺失字符一起工作。
  • 仍然没有提出问题。请edit您的问题并提出一个。首先要记住问题以问号结尾。 (我不应该如此努力地让您告诉我们您希望我们为您提供什么帮助,因为您是寻求我们帮助的人。):-) 我在完成整个事情时遇到了问题工作根本不具体。
  • 您可能还想查看已编写的组合函数:mennovanslooten.nl/blog/post/70 然后添加此部分 stackoverflow.com/questions/881085/… 之后您将不得不遍历字符串和组合数组以及它的子数组获得您的解决方案
  • 感谢您的链接,但是我已经对许多不同的组合函数功能进行了大量研究,但是我需要它在 javascript(没有 php、ruby 等)中并且没有扩展名,例如原型。

标签: javascript combinatorics brute-force cartesian-product repeat


【解决方案1】:

也许下面的函数纯javascript对你来说是一个可能的解决方案。它使用Array.prototype.reduce 来创建给定字母表x 的笛卡尔积c,其功率n 取决于单词w 中感叹号的数量。

function combinations(w) {
    var x = new Array(
            "A","B","C","D","E","F","G","H","I","J","K",
            "L","M","N","O","P","Q","R","S","T","U","V",
            "W","X","Y","Z",0,1,2,3,4,5,6,7,8,9
        ),
        n = w.match(/\!/g).length,
        x_n = new Array(),
        r = new Array(),
        c = null;

    for (var i = n; i > 0; i--) {
        x_n.push(x);
    }

    c = x_n.reduce(function(a, b) {
        var c = [];
        a.forEach(function(a) {
            b.forEach(function(b) {
                c.push(a.concat([b]));
            });
        });
        return c;
    }, [[]]);

    for (var i = 0, j = 0; i < c.length; i++, j = 0) {
        r.push(w.replace(/\!/g, function(s, k) {
            return c[i][j++];
        }));
    }

    return r;
}

在浏览器控制台中这样称呼它console.log(combinations("ov!rf!ow"))

【讨论】:

  • 感谢您的努力和想法!不幸的是,我认为这不会起作用,因为我需要它在纯 JS 中,正如我之前在我的 cmets 中提到的那样,没有原型等扩展(在当前设置中无法使用此扩展)。
  • 这是纯javascript,只需将内容放入控制台即可!
  • 我并不是说这不是纯 JS,我只是重申我在之前的评论中所说的话。我认为我无法在我们的实现中访问原型扩展,但我明天会在我们的设置中尝试这个,看看我是否可以让它工作并确定让你知道。
  • 我不明白你的意思,不需要像 Prototype 这样的扩展。是什么让你想到这一点?你知道Array.protoype.reduceECMA-262 (15.4.4.21) 的一部分吗?
  • 我也改了代码,所以里面没有prototype这样的字眼,虽然没什么区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2018-01-08
  • 1970-01-01
  • 2017-09-10
  • 2018-05-01
  • 2019-09-22
  • 2021-10-16
相关资源
最近更新 更多