我有一个这样的列表:
my_list = ['A','AC','F','AB','ADF','D','DF','C','B]
我想找到一种算法来对列表进行排序:
sorted_list = ['A','C','AC','B','AB','F','D','DF','ADF']
我想知道是否有人能够识别模式可以推荐给我一个公认的算法来解决这类问题。谢谢你。
我注意到了这里的另一个模式,
step1:从左到右查找,找出第一个超过一个字母的字符串
第2步:将第一个列表中出现的所有可能的组合(从第1步开始),然后是字符串本身。
步骤3:重做步骤1中后面两个以上的字符串,只插入没有出现的组合。
这只是基于一个例子,所以我不能确定这是正确的模式,但它适用于这个例子。
我能看到的唯一规则是单个字母必须先出现,然后才能出现在更长的字符串中。
如果所有的字符串都是节点,并且每个字母都有一条(有向)边,从它到包含它的所有字符串,然后你结束了拓扑排序。但是还有很多其他的解。例如,A, B, C, D, F, AB, AC, ADF, DF也是有效的。
也可以是所有字符串都有一条边到所有包含它(或它的字符)的其他字符串。这将强制ADF在DF之后。
目标排序列表如下:
[' A ', ' C ',‘交流’,‘B’,"AB"、"F","D"、"DF"、"ADF")
但是让我们假设这也是可能的:
[A, B,"AB"、"C"、"交流"、"D","F","DF"、"ADF")
感觉更有序了。这样就更容易找到创造模式了。我们首先按字典顺序排列原始列表:
[A, B, C, D, F,"AB"、"交流"、"DF"、"ADF")
然后我们从左开始顺序扫描列表,根据我们定义的标准寻找可以移动到左边的单词。例如,我们发现'AB'包含位于其左侧的字母。
[A', 'B', 'C', 'D', 'F', 'AB', 'AC', 'DF', 'ADF']
因此,我们将其尽可能向左移动,而不绕过任何包含这些字母的单词。
[A', 'B', 'AB', 'C', 'D', 'F', 'AC', 'DF', 'ADF']
以此类推。由OP来决定目标排序列表是一成不变的,还是仅仅是未知生成算法的几个等可能结果中的一个。