public string AlienOrder(string[] words) { int len = 0; for (int i = 0; i < words.Length; i++) { len = Math.Max(len, words[i].Length); } var g = new Graph(); for (int i = 0; i < words.Length; i++) { for (int l = 0; l < words[i].Length; l++) { g.AddNode(words[i][l]); } } var skip = new bool[words.Length]; for (int l = 0; l < len; l++) { for (int i = 0; i < words.Length - 1; i++) { if (skip[i + 1]) { continue; } if (l >= words[i].Length) { continue; } if (words[i][l] == words[i + 1][l]) { continue; } try { g.InsertEdgeOrdered(words[i][l], words[i + 1][l]); } catch { return(string.Empty); } skip[i + 1] = true; } } return(TopologicalSorter.SortToString(g)); }