Beispiel #1
0
    static void FindWords(string letters, DawgNode node, List <DawgNode> words)
    {
        Console.Error.WriteLine("Searching Letters: " + letters);

        if (letters.Length == 0)
        {
            return;
        }

        var matches = node.Children.Where(c => letters.Contains(c.Key))
                      .Select(c => c.Value);

        Console.Error.WriteLine("Matched nodes: " + string.Join(" ", matches.Select(n => n.Letter)));
        foreach (var m in matches)
        {
            if (m.Word != null)
            {
                words.Add(m);

                Console.Error.WriteLine("Found Word: {0} with Value: {1} and Index: {2}",
                                        m.Word, m.Value, m.Index);
            }

            int    pos        = letters.IndexOf(m.Letter);
            string newLetters = letters.Substring(0, pos) + letters.Substring(pos + 1);

            FindWords(newLetters, m, words);
        }
    }
Beispiel #2
0
        private static void TraverseNode(ISet <string> words, StringBuilder builder, DawgNode node)
        {
            foreach (var child in node.Children)
            {
                builder.Append(child.Key);
                if (child.Value.TerminalNode)
                {
                    words.Add(builder.ToString());
                }

                TraverseNode(words, builder, child.Value);
                builder.Length -= 1;
            }
        }
Beispiel #3
0
        public DawgCreatorTest()
        {
            nodes = new DawgNode[numNodes];
            int idx = 0;

            nodes[idx++] = new DawgNode(1, Dawg.DEFAULT_LETTER, false, true);               // node 0

            nodes[idx++] = new DawgNode(3, Dawg.FORWARD_WORD_DAWG_SYMBOL, false, false);    // node 1
            nodes[idx++] = new DawgNode(7, Dawg.REVERSE_PARTWORD_DAWG_SYMBOL, false, true); // node 2

            nodes[idx++] = new DawgNode(4, (byte)'B', false, true);                         // node 3
            nodes[idx++] = new DawgNode(5, (byte)'A', false, true);                         // node 4
            nodes[idx++] = new DawgNode(6, (byte)'T', false, true);                         // node 5
            nodes[idx++] = new DawgNode(0, (byte)'S', true, true);                          // node 6

            nodes[idx++] = new DawgNode(11, (byte)'A', false, false);                       // node 7
            nodes[idx++] = new DawgNode(0, (byte)'B', true, false);                         // node 8
            nodes[idx++] = new DawgNode(10, (byte)'S', false, false);                       // node 9
            nodes[idx++] = new DawgNode(12, (byte)'T', false, true);                        // node 10

            nodes[idx++] = new DawgNode(0, (byte)'B', true, true);                          // node 11

            nodes[idx++] = new DawgNode(11, (byte)'A', false, true);                        // node 12
        }
Beispiel #4
0
    static void Main(string[] args)
    {
        int N     = int.Parse(Console.ReadLine());
        var words = new string[N];

        for (int i = 0; i < N; i++)
        {
            string W = Console.ReadLine();
            words[i] = W;
            Console.Error.WriteLine(W);
        }
        string LETTERS = Console.ReadLine();

        Console.Error.WriteLine(LETTERS);
        var root = new DawgNode('\0');

        int idx = 0;

        foreach (var word in words)
        {
            bool validWord = true;
            if (word.Length <= 7)
            {
                var node = root;
                foreach (var l in word)
                {
                    if (!LETTERS.Contains(l))
                    {
                        validWord = false;
                        break;
                    }
                    if (!node.Children.ContainsKey(l))
                    {
                        var n = new DawgNode(l);
                        node.Children.Add(l, n);
                    }

                    node = node.Children[l];
                }
                if (validWord)
                {
                    node.Word  = word;
                    node.Value = Value(word);
                    node.Index = idx++;

                    Console.Error.WriteLine("Found Word: " + node.Word);
                }
            }
        }

        var found = new List <DawgNode>();

        FindWords(LETTERS, root, found);

        string maxWord =
            found.OrderByDescending(w => w.Value)
            .ThenBy(w => w.Index)
            .First().Word;


        Console.WriteLine(maxWord);
    }
Beispiel #5
0
 public TestDawgNode(DawgNode node)
 {
     Id           = node.Id;
     TerminalNode = node.TerminalNode;
     Children     = node.Children;
 }