LCS問題的解決思路
解最長公共子序列問題時(shí)最容易想到的算法是窮舉搜索法,即對X的每一個(gè)子序列,檢查它是否也是Y的子序列,從而確定它是否為X和Y的公共子序列,并且在檢查過程中選出最長的公共子序列。X和Y的所有子序列都檢查過后即可求出X和Y的最長公共子序列。X的一個(gè)子序列相應(yīng)于下標(biāo)序列{1, 2, …, m}的一個(gè)子序列,因此,X共有2m個(gè)不同子序列(Y亦如此,如為2^n),從而窮舉搜索法需要指數(shù)時(shí)間(2^m * 2^n)。
動(dòng)態(tài)規(guī)劃算法
??? 事實(shí)上,最長公共子序列問題也有最優(yōu)子結(jié)構(gòu)性質(zhì)。
記:
Xi=﹤x1,?,xi﹥即X序列的前i個(gè)字符 (1≤i≤m)(前綴)
Yj=﹤y1,?,yj﹥即Y序列的前j個(gè)字符 (1≤j≤n)(前綴)
假定Z=﹤z1,?,zk﹥∈LCS(X , Y)。
若xm=yn(最后一個(gè)字符相同),則不難用反證法證明:該字符必是X與Y的任一最長公共子序列Z(設(shè)長度為k)的最后一個(gè)字符,即有zk = xm = yn 且顯然有Zk-1∈LCS(Xm-1 , Yn-1)即Z的前綴Zk-1是Xm-1與Yn-1的最長公共子序列。此時(shí),問題化歸成求Xm-1與Yn-1的LCS(LCS(X , Y)的長度等于LCS(Xm-1 , Yn-1)的長度加1)。
若xm≠yn,則亦不難用反證法證明:要么Z∈LCS(Xm-1, Y),要么Z∈LCS(X , Yn-1)。由于zk≠xm與zk≠yn其中至少有一個(gè)必成立,若zk≠xm則有Z∈LCS(Xm-1 , Y),類似的,若zk≠yn 則有Z∈LCS(X , Yn-1)。此時(shí),問題化歸成求Xm-1與Y的LCS及X與Yn-1的LCS。LCS(X , Y)的長度為:max{LCS(Xm-1 , Y)的長度, LCS(X , Yn-1)的長度}。
由于上述當(dāng)xm≠yn的情況中,求LCS(Xm-1 , Y)的長度與LCS(X , Yn-1)的長度,這兩個(gè)問題不是相互獨(dú)立的:兩者都需要求LCS(Xm-1,Yn-1)的長度。另外兩個(gè)序列的LCS中包含了兩個(gè)序列的前綴的LCS,故問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)考慮用動(dòng)態(tài)規(guī)劃法。
也就是說,解決這個(gè)LCS問題,你要求三個(gè)方面的東西:1、LCS(Xm-1,Yn-1)+1;2、LCS(Xm-1,Y),LCS(X,Yn-1);3、max{LCS(Xm-1,Y),LCS(X,Yn-1)}。