1

私の質問は、まだ回答されていないこの質問にています。

コード(または提案される可能性のある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="";
}

これは、たった1つの「!」でうまく機能します。

helloworAd
helloworBd
helloworCd
...
helloworLd

ただし、「!」が2つ以上あると、次のようになります。

heAAowArAd
heBBowBrBd
heCCowCrCd
...
heLLowLrLd

これは繰り返し部分には適していますが、欠落している各文字スポットで可能なすべての配列M文字をテストする必要もあります。

4

1 に答える 1

1

たぶん、純粋なjavascriptの次の関数があなたのための可能な解決策です。これは、指定されたアルファベットArray.prototype.reduceのデカルト積を作成するために使用されます。これにより、その力は、単語の感嘆符の数に依存します。cxnw

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"))ブラウザコンソールでこのように呼び出します。

于 2013-03-23T04:21:09.020 に答える