使用一个有26个顶点的有向图,每个顶点代表一个字符。从顶点A到顶点B的边表示在字母表中B排在A前面。
第一步是建立这样一个只有顶点没有边的图。
其次,逐个单词扫描输入字典,并将每个单词与前一个单词进行比较。您应该为您扫描的每个单词找到确切的关系。因此,在这张图中添加一条边。假设字典是正确的,则不应出现冲突。
完成字典后,按以下方式输出字母表:
- 随机选择一个顶点,遍历其路径,直到找到指向 nothing 的一个字符。这是字母表中的第一个字符。输出它并将其从图中删除。
- 重复执行步骤 1 直到所有顶点都被删除。
编辑:
为了更好地解释这个算法,让我们以您的样本输入作为例子运行它。
输入:{"zebra', "apple", "cat", "crass"}
单词0和单词1,我们立即知道z在a之前,所以我们建立一条边a->z
单词1和单词2,我们立即知道a在c之前,所以我们又建立了一条边c->a
单词2和单词3,第一个字母相同为"c",但第二个字母不同,所以我们得到a在r之前,因此我们有另一条边r->a
现在所有单词都被读取。通过随机选择一个顶点(假设我们选择了c),然后我们可以在图中找到c->a->z的路径。输出z并将其从图中删除(标记为NULL)。现在选择另一个顶点(假设我们选择了r),然后我们发现图中有r->a的边。我们输出a并将其从图中删除。现在我们再次选择c,没有找到路径,所以我们只需输出c并将其删除。最后选择r,再次没有找到路径,所以我们输出r并将其删除。由于所有顶点都已删除,该算法完成。
输出为z,a,c,r。 "c" 和 "r" 的顺序是随机的,因为我们从输入中不知道它们之间的关系。
"cat", "car"
可以看出t < r
)。但是在给定的例子中并非如此;我无法看出他们从哪里得到了 'r' 的顺序。 - Emil Vikströmz<a, z<c, a<c, a<r
。可选地,添加z<r
因为优先级是传递的。通过假设 "X<Y" 等同于 "节点 X 与节点 Y 之间有单向连接",将规则转换为有向无环图。找到一条遍历所有你想排序的字符的路径。该路径上的节点即为所需排序顺序。 - Kevin