你有一个单词数组中的字典,我建议使用这个数据结构,因为它已经足够好并且转换需要时间。
你想找到正确的字符顺序,
C1, C2, C3, C4, ..., Cn
你的字典中有 m 个单词。最好有一组规则,例如 (Ci, Cj),这意味着 Ci <= Cj,其中 i, j 是正自然数并且 i < m, j < m。我们应该有一组错误
因为 V 是一个巨大的数字并且它大于 m * m,所以我认为一个好的方法如下:
foreach i = 1, m do
foreach j = i + 1, m do
findFirstDifferenceInTheWords
/*charI is the first difference in Wi from Wj and charJ is the first difference in
Wj*/
if (Wi <> Wj)
if (Wi contains Wj or Wj contains Wi) == false
charSet.add(charI, charJ)
else if k exists and the following is true ((i < k < j) and (Wi <> Wk))
error.addIfDoesntExist("paradox", Wi)
else
error.addIfDoesntExist("redundant", Wi)
end_if
end_foreach
end_foreach
我们找到了 l 条规则
foreach i = 1, l do foreach j = i + 1, l do if charSet.exists(charI, charJ) and charSet.exists(charJ, charI) error.add("悖论关系", charI, charJ)
在此之后,您可以通过考虑 charI = charJ 在集合中同时存在 (charI, charJ) 和 (charJ, charI) 并且 charI <= charJ 是唯一的规则来构建单词的顺序,反之亦然,我们可以考虑那个 charI < charJ。
结论:使用“<=”关系比使用“<”关系要好,因为“<=”是数论中一个完整的良好有序关系,“<”只是良好的有序关系。注意:如果 charI < charJ 或 charI = charJ,输出必须正确显示。例如,您可以使用以下表示法:characters(C1C2C3, C4, C5C6, ...) 其中 C1 = C2 = C3 < C4 < C5 = C6...
我希望这有帮助。
当然,如果 Wj 包含 Wi 那么我们不能从那里提取规则