我问了一个question https://stackoverflow.com/q/8685598/35690关于在可变数量的集合中查找没有重复字符的子序列。解决方案是创建每对字母的矩阵,丢弃每组中未出现的字母,然后找到最长路径 http://en.wikipedia.org/wiki/Longest_path_problem在有向无环图中。但是,我不想要最长的路径,我想要几个最长的路径(例如,如果它生成长度为 10、10、9、8、8、3、3、2 和 1 的子序列,我可能想要仅显示前 5 个子序列)。
因此,由于我不仅仅寻找最长的路径,为了生成结果子序列,而不是使用维基百科文章中描述的最长路径算法,我使用了一种简单的算法,它只是生成所有的列表可能的子序列。这会生成类似于结果的集合一个答案 https://stackoverflow.com/a/8686019/35690对于我之前的问题。
问题是我想减少它生成的子序列的数量。
例如,如果我有以下集合:
A = AB12034
B = BA01234
C = AB01234
...我的算法目前将得出每组中出现的以下对:
A - 1 B - 1 1 - 2 2 - 3 0 - 3 3 - 4
2 2 3 4 4
3 3 4
4 4
0 0
这在技术上是正确的,但我想消除其中一些对。例如,请注意2
总是在之后1
。因此,我想消除A2
and B2
对(即A
and B
永远不应该直接跳到2
...他们应该总是经历1
第一的)。还,1
不应该跳转到除此之外的任何数字2
, since 2
总是紧随其后发生。此外,请注意如何0
总是发生在B
and 3
,所以我想消除这对B3
(再次,B
应该总是经过0
在它跳转到之前3
,因为所有集合的这三个字母的位置为:B < 0 < 3
).
需要明确的是,当前的算法将得出这些子序列:(我只包括那些以A
为简洁起见):
A1234
A124 *
A134 *
A14 *
A234 *
A24 *
A34 *
A4 *
A034
A04 *
...以及所有标有*
应该被消除。
生成所需子序列的(正确)对将是:
A - 1 B - 1 1 - 2 2 - 3 0 - 3 3 - 4
0 0
...子序列的完整列表将是:
A1234
A034
B1234
B034
1234
234
034
34
换句话说,我试图从这个有向无环图出发:
To this:
我应该使用什么样的算法/逻辑来消除这些无关的对(即图形边缘)?或者您认为我首先生成对的逻辑应该改变吗?