实验目的:
熟悉并实现最长公共子序列算法,理解动态规划算法的核心思想。
问题定义
输入任意两个字符串,求其最长公共子序列。
输入格式:两条随机序列,如 1 3 4 5 5 and 2 4 5 5 7 6
输出格式:它们的最长公共子序列,例:4 5 5
最小规模:程序可处理的序列长度不得小于100
实验思想
记 Xi=﹤x1,⋯,xi﹥即X序列的前i个字符 (1≤i≤m)(前缀)
Yj=﹤y1,⋯,yj﹥即Y序列的前j个字符 (1≤j≤n)(前缀)
假定Z=﹤z1,⋯,zk﹥∈LCS(X , Y)。
若xm=yn(最后一个字符相同),则不难用反证法证明:该字符必是X与Y的任一最长公共子序列Z(设长度为k)的最后一个字符,即有zk = xm = yn 且显然有Zk-1∈LCS(Xm-1 , Yn-1)即Z的前缀Zk-1是Xm-1与Yn-1的最长公共子序列。
若xm≠yn,则亦不难用反证法证明:要么Z∈LCS(Xm-1, Y),要么Z∈LCS(X , Yn-1)。
由于zk≠xm与zk≠yn其中至少有一个必成立,若zk≠xm则有Z∈LCS(Xm-1 , Y),类似的,
若zk≠yn 则有Z∈LCS(X , Yn-1)
若xm=yn,则问题化归成求Xm-1与Yn-1的LCS