我曾经提出了一个问题,关于在变量数量的集合中找到不重复字符的子序列。解决方法是创建每对字母的矩阵,丢弃那些不在每个集合中出现的字母,然后在有向无环图中找到最长路径。然而,我不仅想要最长路径,我还想要几个最长路径(例如,如果它生成长度为10、10、9、8、8、3、3、2和1的子序列,则我可能只想显示前5个子序列)。
因此,由于我不仅寻找最长路径,为了生成结果子序列,我使用了一个简单的算法来生成所有可能的子序列列表,而不是使用维基百科文章中描述的最长路径算法。这将生成类似于之前问题的答案中的结果集。
问题是我想要减少其生成的子序列数量。
例如,如果我有以下集合:
这在技术上是正确的,但我想消除其中的一些对。例如,请注意
清楚地说,当前算法将得出以下子序列(为简洁起见,我仅包括以
换句话说,我正试图从这个有向无环图中进行转换:
因此,由于我不仅寻找最长路径,为了生成结果子序列,我使用了一个简单的算法来生成所有可能的子序列列表,而不是使用维基百科文章中描述的最长路径算法。这将生成类似于之前问题的答案中的结果集。
问题是我想要减少其生成的子序列数量。
例如,如果我有以下集合:
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
和B2
对(即A
和B
不应直接跳到2
...它们应该始终先经过1
)。此外,1
不应跳到除2
之外的任何数字,因为2
总是紧随其后。此外,请注意0
始终出现在B
和3
之间,因此我想消除对B3
(同样,B
在跳到3
之前应始终通过0
,因为所有集都将这三个字母的位置设置为: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
换句话说,我正试图从这个有向无环图中进行转换: