求答疑:基于LCS的DP表生成的最小超序列的正确性证明
基于LCS的最小超序列正确性证明
一、证明它是最小长度的超序列
设两个输入字符串为 S(长度 m)和 T(长度 n),它们的最长公共子序列(LCS)长度为 l。
- 任何合法超序列必须包含
S的全部m个字符和T的全部n个字符,但LCS的l个字符是两者共有的,直接合并时会被重复计算两次。因此,超序列的理论最小长度为m + n - l——这是无法再缩小的下界,因为必须覆盖所有独有字符,同时公共字符仅需保留一次。 - 基于DP表构造的超序列,恰好是将
S和T中不属于LCS的字符按顺序加入,同时LCS的字符仅保留一次,最终总长度就是m + n - l,完全匹配理论最小长度,因此它是最小的。
二、证明它是合法超序列(保持原字符串顺序)
要证明这一点,需要结合DP表的回溯构造逻辑分析:
回溯构造的核心规则(从DP表右下角 dp[m][n] 向左上角回溯)
- 若
S[i] == T[j]:该字符属于LCS,将其加入结果集合,然后同时向左上移动(i--,j--)。 - 若
dp[i][j] == dp[i-1][j]:说明S[i]不在LCS中,将其加入结果集合,向上移动(i--)。 - 若
dp[i][j] == dp[i][j-1]:说明T[j]不在LCS中,将其加入结果集合,向左移动(j--)。 - 当
i > 0或j > 0时,继续处理剩余字符,直到i == 0且j == 0。最后将结果集合反转,得到最终超序列。
顺序保持的证明
S的字符顺序保持:S中的任意两个字符s_a和s_b,若在原S中s_a出现在s_b前面(即i_a < i_b),回溯时s_b会先被处理(无论是否属于LCS),因此会先被加入结果集合。反转结果后,s_a就会回到s_b前面,与原S的顺序完全一致。T的字符顺序保持:
同理,T中的任意两个字符t_c和t_d,若原T中t_c出现在t_d前面(j_c < j_d),回溯时t_d先被处理并加入结果,反转后t_c位于t_d之前,与原T顺序一致。LCS字符的双重顺序兼容:
LCS本身就是同时保持S和T顺序的公共子序列,因此回溯时加入的LCS字符,在最终超序列中的顺序既符合S的要求,也符合T的要求。
综上,基于LCS DP表构造的序列既满足最小长度要求,又完全符合超序列的顺序要求,是合法的最小超序列。
内容的提问来源于stack exchange,提问作者myfakeaccount
相关产品推荐
相关产品推荐

