2017-05-22 27 views
6

Czy ktoś wie, w jaki sposób mogę dopasować tablicę pomieszanych liter do słowa, na przykład, pewną funkcję, która będzie pasować do tablicy np. ["A", "c", "a" , "e", "c"]; do słowa "as" i daj mi 1 lub jeśli nie -1 jak indexOf lub InArray, ale za pomieszane słowo. Zrobiłem js skrzypce z przykładem, że jest dobrze udokumentowaneFunkcja dopasowywania zgniecionej tablicy do ciągu znaków

tylko uwaga, będę porównywać tablicę liter do dowolnego miejsca od 30000 - 50000 słów.

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

skąd przechowywania Słownik słów? – karthick

+0

Przechowuję to jako wielowymiarową tablicę, jak to.wordBank słowoBank jest przechowywane alfabetycznie alfabetycznie według znaków, a wewnątrz każdej tablicy znaków jest alfabetycznie wszystkie słowa w obrębie tej litery this.wordBank [character] [characterword] – AlexMika

Odpowiedz

1

rekurencyjna strategia to proste rozwiązanie, ale jeśli tablica gameletters pobiera zbyt duży, to będzie naprawdę spowolnić wykonanie. W przypadku takiej gry jak Scrabble, powinno być jednak odpowiednie.

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