public List <string> Run(Tuple <char[, ], string[]> input) { var board = input.Item1; var words = input.Item2; var rows = board.GetLength(0); var columns = board.GetLength(1); var trie = new TrieNodeMap <string>(); var foundWords = new HashSet <string>(); foreach (var word in words) { trie.Add(word, word); } for (var x = 0; x < columns; x++) { for (var y = 0; y < rows; y++) { var c = board[y, x]; if (trie[c] != null) { var visitedTiles = new HashSet <Tuple <int, int> >(); findWord(x, y, "" + c, trie[c], board, visitedTiles, foundWords); } } } var foundWordSorted = foundWords.ToList(); foundWordSorted.Sort(); return(foundWordSorted); }
public string Run(StringAndWordList input) { var dict = input.Dict; var sentence = input.Sentence; var trie = new TrieNodeMap <string>(); foreach (var entry in dict) { trie.Add(entry, entry); } var sentenceWords = sentence.Split(' ').Where(s => !string.IsNullOrEmpty(s)).ToList(); var newSentence = new StringBuilder(); foreach (var word in sentenceWords) { if (trie.Contains(word)) { newSentence.Append(trie.Get(word)); } else { newSentence.Append(word); } newSentence.Append(' '); } return(newSentence.ToString().Trim()); }
private void findWord(int x, int y, string prefix, TrieNodeMap <string> trieNode, char[,] board, HashSet <Tuple <int, int> > visitedTiles, HashSet <string> foundWords) { visitedTiles.Add(new Tuple <int, int>(y, x)); if (trieNode.Value != null) { foundWords.Add(trieNode.Value); } var rows = board.GetLength(0); var columns = board.GetLength(1); //check up if ((y - 1) >= 0 && !visitedTiles.Contains(new Tuple <int, int>(y - 1, x)) && trieNode[board[y - 1, x]] != null) { var c = board[y - 1, x]; findWord(x, y - 1, prefix + c, trieNode[c], board, visitedTiles, foundWords); } // check left if ((x + 1) < columns && !visitedTiles.Contains(new Tuple <int, int>(y, x + 1)) && trieNode[board[y, x + 1]] != null) { var c = board[y, x + 1]; findWord(x + 1, y, prefix + c, trieNode[c], board, visitedTiles, foundWords); } // check down if ((y + 1) < rows && !visitedTiles.Contains(new Tuple <int, int>(y + 1, x)) && trieNode[board[y + 1, x]] != null) { var c = board[y + 1, x]; findWord(x, y + 1, prefix + c, trieNode[c], board, visitedTiles, foundWords); } // check right if ((x - 1) >= 0 && !visitedTiles.Contains(new Tuple <int, int>(y, x - 1)) && trieNode[board[y, x - 1]] != null) { var c = board[y, x - 1]; findWord(x - 1, y, prefix + c, trieNode[c], board, visitedTiles, foundWords); } visitedTiles.Remove(new Tuple <int, int>(y, x)); }