Words With Friends Word Finder
by aybalasubramanian
HTML
<div class="wrapper">
<label for="letters">Letters</label>
<input type="text" id="letters"/>
<button onclick="findWords()">Find Words</button>
<pre id="words"></pre>
</div>
JavaScript
var letterInput = document.getElementById('letters');
var foundWords = document.getElementById('words');
var findWords = function() {
foundWords.innerHTML = ScrabbleWordFinder.find(letterInput.value.toLowerCase()).join('\n');
};
var ScrabbleWordFinder = (() => {
var ScrabbleWordFinder = function() {
this.dict = new ScrabbleDictionary(ScrabbleWordList);
};
ScrabbleWordFinder.prototype.find = function(letters) {
return validWords(this.dict.root, letters);
};
var validWords = function(node, letters, word = '', results = []) {
if (node.isWord) {
results.push(word);
}
var seen = new Set();
for (let ch of letters) {
if (!seen.has(ch)) {
seen.add(ch);
if (node.children[ch]) {
validWords(node.children[ch], letters.replace(ch, ''), word + ch, results);
}
}
}
return results;
};
var ScrabbleDictionary = function(words) {
this.root = new ScrabbleTrieNode();
words.forEach(word => this.insert(word));
};
var ScrabbleTrieNode = function() {
this.children = Object.create(null);
};
ScrabbleDictionary.prototype.insert = function(word) {
var cursor = this.root;
for (let letter of word) {
if (!cursor.children[letter]) {
cursor.children[letter] = new ScrabbleTrieNode();
}
cursor = cursor.children[letter];
}
cursor.isWord = true;
};
return new ScrabbleWordFinder();
})();