private static string Shortest(SuffixTree tree) { var shortest = new Match(tree.Root, Enumerable.Empty <SuffixTree.Node>()); var queue = new Queue <Match>(); queue.Enqueue(shortest); while (queue.Any()) { var current = queue.Dequeue(); if (shortest.Node == tree.Root || (tree.ToNodeText(current.Node).EndsWith("$") && current.Node.Length > 1 && current.Distance() <= shortest.Distance())) { shortest = current; } var l = new List <SuffixTree.Node>(current.Lineage); l.Add(current.Node); foreach (var child in current.Node.Children) { queue.Enqueue(new Match(child, l)); } } var s = string.Format("{0}{1}", string.Join("", shortest.Lineage.Select(tree.ToText)), tree.ToText(shortest.Node)).Replace("$", ""); return(s); }
public static SuffixTree ToSuffixTree(string text) { var result = new SuffixTree(text); //Console.WriteLine(string.Join(", ", result.ToDebugText())); for (var i = 0; i < text.Length; i++) { result.Merge(i, text.Length - i); //Console.WriteLine(string.Join(", ", result.ToDebugText())); } return result; }