最长公共子序列(LCS)
最长公共子序列+模板
定义
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。一个序列S,如果分别是两个或多个已知的序列的子序列,并且是所有子序列中最长的,则称序列S为最长公共子序列。
如序列1 2 3 4 5 6 7 8
和序列5 6 7 8 1 2 3 4
,他们的最长公共子序列为1 2 3 4
和5 6 7 8
,其长度为4,由此可知,最长公共子序列也唯一,但长度唯一。
最长公共子序列,可以识别两段文字之间的“相似度”,即查重。
解法
动态规划
最长公共子序列问题具有最优子结构和重复子问题,因此可以考虑动态规划。
设,表示序列a和b的长度分为i和j时的最长公共子序列的长度,则就是序列a和b的最长公共子序列。
**状态表示:**dp[i][j] 为序列a到i位置和序列b到j位置时的最长公共子序列。
状态转移:
1 | for (int i = 1;i <= n;i ++) |