我有很多字符串数组.根据相同的标准,每个数组中的字符串以相同的方式排序.但是,某些数组可能缺少某些字符串,并且可能没有包含完整字符串集的数组.此外,用于比较字符串的标准对我来说是不可用的:在数组的上下文之外,我无法分辨哪个字符串应该在另一个字符串之前.
我需要一种方法来生成一组完整的字符串,正确排序.或者当阵列没有足够的信息供我这样做时失败.
有人熟悉这种问题吗?什么是正确的算法?
例子:
A B D A C D
无法正确排序,无法确定B和C的顺序
A B D A B C A C D
这有足够的信息来正确地订购ABCD.
我可以想到一种可能的方式,尽管可能不是最有效的方式:
我将用你的例子来解释:
A B D A B C A C D
创建一个唯一字符的数组,所以你会得到(例如):
A B D C
你也应该有一个枚举来描述可能的关系
enum Type { Unknown = 0, Greater = 1, Equal = 2, Less = 3, }
现在,创建一个方形矩阵,其尺寸与上面的数组相同,默认为Type.Unknown.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
在计算排序时,您的数组将作为矩阵的索引.看看我的意思,看看这里:
A B D C A 0 0 0 0 B 0 0 0 0 D 0 0 0 0 C 0 0 0 0
通过并将对角线设为Type.Equal
2 0 0 0 0 2 0 0 0 0 2 0 0 0 0 2
现在你需要填充矩阵,遍历每个输入数组并获取每个字符和后面的字符.使用这两个字符,在矩阵中找到每个字符的索引(使用您的数组)并更新矩阵.
for(int i=0; i每次在网格中分配2个位置,因为当一个char小于另一个char时,它还意味着第二个char大于第一个char.
现在你只需将chars一次插入一个数组(Linked List将是最简单的,你会在一秒钟内看到原因)
每次插入一个char时,都会从返回数组的开始处开始,遍历,查找第一个数组中的索引,并检查矩阵的Type.Greater或Type.Less(取决于哪种方式)你正在比较,curr char到数组,或数组到当前char)并插入它,如果你遇到的值不同于你的预期.
如果你在插入过程中遇到了matix中的Type.Unknown,你知道你没有足够的信息来排序这些数组,如果你点击Type.Equal,你可以忽略插入这个char(假设你不想重复)在你的结果中.)
然后你会输出你的返回数组