コード例 #1
0
        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);
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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));
        }