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); } }
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; } }
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 }
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); }
public TestDawgNode(DawgNode node) { Id = node.Id; TerminalNode = node.TerminalNode; Children = node.Children; }