2017-05-22 4 views
6

どのようにして、混乱した文字の配列を単語にマッチさせることができるか知っていますか?たとえば、一致する一部の関数 ["a"、 "c" 、 "e"、 "c"]; という単語に "ace"を付けて、indexOfやInArrayのように-1を返します。 私はそれがよく文書化されている例でjsのバイブルを作った混乱した配列を文字列にマッチさせる機能

ちょうどメモ、私は30000 - 50000ワードから任意の場所に文字の配列を比較します。

https://jsfiddle.net/AlexanderMitrakis/89dchpt8/1/

this.gameletters = []; //Array of Game letters. 
       //e.g. ["P", "E", "H", "E", "U", "I", "S", "Q", "N"]; 


this.possiblesolution = new String(); //highest solution within gameletters 
       //e.g. "QUEENSHIP" (related to above letters) 

this.wordBank = new Array(); 
       //array of arrays structure is formated around alphabet with an array for each character: 
       /* 
       a: Array(7295) 
       b:Array(7271) 
       c:Array(11381) 
       d:Array(7216) 
       ... 
       y:Array(607) 
       z:Array(623) 
       */ 
+0

? – karthick

+0

私はthis.wordBankのように多次元配列として格納します。格納されているwordBankはアルファベット順に文字順に並べられ、各文字配列の中にアルファベット順にその文字内のすべての単語this.wordBank [文字] [文字列] – AlexMika

答えて

1

再帰的な戦略はシンプルなソリューションですが、あなたのgameletters配列が大きくなりすぎた場合、それは本当に実行が遅くなります。スクラブルのようなゲームの場合は、十分なはずです。あなたは単語の辞書を格納します

Fiddle

var gameletters = ["P", "E", "H", "E", "U", "I", "S", "Q", "N"]; 
var wordbank = { 
    "a": Array(3461), 
    "b": Array(2391), 
    //... 
}; 

var matches = {}; 

function step(word, letters) { 
    for(var i = 0, len = letters.length; i < len; i++) { 

    var arr = letters.map(a => a); 
    if (arr.length === 0) { 
     return; 
    } 

    var letter = arr[i]; 
    arr.splice(i,1); 
    test(word + letter); 

    if (arr.length) { 
     step(word + letter, arr) 
    } 
    } 
} 

function test(word) { 
    var firstLetter = word.substr(0,1); 
    if (wordbank[firstLetter].indexOf(word) >= 0) { 
    matches[word] = 1; 
    } 
} 

step("", gameletters); 
関連する問題