最長公共子串(longest common substirng)和最長公共子串行(longest common subsequence,lcs)的區別為:子串是串的乙個連續的部分,子串行則是從不改變序列的順序,而從序列中去掉任意的元素而獲得新的序列;也就是說,子串中字元的位置必須是連續的,子串行則可以不必連續。
1、序列str1和序列str2
·長度分別為m和n;
·建立1個二維陣列l[m.n];
·初始化l陣列內容為0
·m和n分別從0開始,m++,n++迴圈:
- 如果str1[m] == str2[n],則l[m,n] = l[m - 1, n -1] + 1;
- 如果str1[m] != str2[n],則l[m,n] = max
·最後從l[m,n]中的數字一定是最大的,且這個數字就是最長公共子串行的長度
·從陣列l中找出乙個最長的公共子串行
2、從陣列l中查詢乙個最長的公共子串行
i和j分別從m,n開始,遞減迴圈直到i = 0,j = 0。其中,m和n分別為兩個串的長度。
·如果str1[i] == str2[j],則將str[i]字元插入到子串行內,i--,j--;
·如果str1[i] != str[j],則比較l[i,j-1]與l[i-1,j],l[i,j-1]大,則j--,否則i--;(如果相等,則任選乙個)
我們可以得到其中公共子串:b c b a 和 b d a b。
#include #define n 1000using
namespace
std;
//c[i][j]儲存str1[1...i]與str2[1...j]的最長公共子串行的長度
intc[n][n];
//flag[i][j]標記是那種子問題
//flag[i][j]==0為str1[i]==str2[j]
//flag[i][j]==1為c[i-1][j]>=s[i][j-1]
//flag[i][j]==-1為c[i-1][j]int
flag[n][n];
int getlcslength(string str1, string
str2)
else
if (c[i - 1][j] >= c[i][j - 1
])
else}}
return
c[len1][len2];
}void getlcs(string s1, string s2,int len,char*
lcs)
else
if(flag[i][j]==1) //
往上 i--;
else
if(flag[i][j]==-1)//
往左 j--;
}}int
main()
最長公共子串行(LCS)問題
問題描述 見演算法導論p208 p209 前提概念 給定乙個序列x x1,x2,xm 對i 0,1,m,記x的第i個字首為xi x1,x2,xi 故xm x,而x0是個空序列 乙個給定序列的子串行就是該序列去掉0個或多個元素 不一定連續 如bcdb是abcbdab的乙個子串行 基於以上定義,最長公共...
最長公共子串行問題LCS
乙個給定序列的子串行是指在原序列順序不變的基礎上刪去若干元素後得到的序列。給定兩個序列x和y,當乙個序列z既是x的子串行又是y的子串行時,稱z序列為x和y 的公共子串行。例如,x a,b,c,b,d,a,b y b,d,c,a,b,a 則序列 b,c,a 是x和y的乙個公共子串行,但不是x和y的最長...
最長公共子串行 LCS 問題
前言 學習過的知識,只要不經常使用就會忘記,所以在此寫部落格,記錄下來,方便自己,也可能有利於他人。最長公共子串行 lcs 問題。1.什麼是最長公共子串行?最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別是兩個或多個已知序列的子...