一种可能的方式我能想到的,虽然可能不是最有效的:
我就要用你的例子来解释:
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<len(arr)-1; i++)
{
char c1 = arr[i], c2 = arr[i+1];
int i1,i2;
//get indices of characters in array and put in i1, and i2 respectively
matrix[i1][i2] = Type.Less;
matrix[i2][i1] = Type.Greater
}
分配在网格每次2个位置,因为当一个字符是小于另一个,这也意味着所述第二字符是大于第一。
现在您只需一次插入的字符到一个数组一个(链表是最简单的,你就会明白为什么在第二)
每次插入字符,你将开始在开始你的返回数组,然后迭代,查找第一个数组中的索引,并检查矩阵中的Type.Greater或Type.Less(取决于你正在比较的方式,curr char到数组还是数组当前字符)并插入它,如果你遇到一个不同于你所期望的值。
如果你在插入过程中在matix中打了一个Type.Unknown,你知道你没有足够的信息对这些数组进行排序,如果你点击了Type.Equal,你可以忽略插入这个字符串(假设你不用“不想在你的结果重复。)
然后您可以输出你的回报阵列
哇!狡猾...和有趣的。你是否需要一种可以在外部工作的方法,或者所有的阵列都能够舒适地记忆? – erickson 2008-11-12 20:51:03
另外,重复呢?这并不明确,但似乎你想删除它们? – erickson 2008-11-12 20:52:58
这一切都在记忆中。实际上,甚至字符串总数的平方都非常适合记忆。 – Arkadiy 2008-11-12 20:53:24