最长公共子序列(Longest Common Subsequence)
最长公共子序列(longest common sequence)
最长公共子串(longest common substring)
1)什么是子序列呢?即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。
2)什么是子串呢?给定串中任意个连续的字符组成的子序列称为该串的子串。
【例1】最长公共子序列
【问题简述】
给定的字符序列 X =“x0,x1,…,xm-1” ,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列<i0,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij =yj。
例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。给出两个字符串S1和S2,长度不超过5000,求这两个字符串的最长公共子串长度。
【问题分析】
S1=“ABCBDAB”
S2=“BDCABA”
可以看出他们的最长公共子序列有BCBA,BDAB,长度为4
从样例分析,我们思考的方式为要找出S1串与S2串的公共子序列,假设将S1固定,从
第1个位置开始直到最后一个位置为止,与S2的各个部分不断找最长公共子序列
当然S1也可以变化,这样我们即得出了思路:
枚举S1的位置 i
枚举S2的位置 j
找出S1的前i位与S2的前j位的最长公共子序列,直到两个串的最后一个位置为止。
S1=设f[i,j]表示S的前i位与T的前j位的最长公共子串长度。则有,