通常兩個字串的最大公共子串的問題是通過下面的演算法來完成的: 把字串1(長度m)橫排,串2(長度n)豎排,得到乙個m×n的矩陣c,矩陣的每個元素的值如下,如果m[i]=n[j],則c[j][i]=1,否則,c[j][i]=0。然後找出矩陣中連續是1的對角線最長的乙個,則對角線的長度就是公共子串的長度.
一看這個方法就會發現一些問題,好處是這個演算法很簡單,實現也比較容易,缺點卻是:1、時間複雜度大於 o(n*m) 在生產map 表之後,還需要對map 表進行搜尋,得到最大對角線。2、需要生成乙個n×m 的map 表,比較浪費空間。 無論從執行時間還是從空間的角度來看都有一些問題。 其實這個算計可以進行一定的改進。
1. 沒有必要生成這個map 表,只要定義兩個標量記錄一下起始的位置和長度就ok 了
2、從乙個串中取出元素順序的和另外乙個串比較。記錄起始位置和長度,判斷一下是不是比前乙個記錄的長,如果比前乙個長就儲存當前的這個記錄。
這樣下來演算法的時間複雜度就是o(n*m) ,基本不需要額外的空間。
演算法 LCS及輸出LCS
最長公共子串行 include using namespace std typedef long long ll char a 1005 b 1005 pos i j 的三個值1,2,3分別表示左 左上和上 pos記錄當前lcs是從哪個點過來的,如果不等於2說明當前值是繼承自上乙個相等的點 所以如果...
LCS演算法的C 實現
感謝july大神,感謝其團隊的鄒博。目標一 實現下圖中的矩陣 首先根據要比較的x,y字串構造二維陣列c,維度是x和y的長度 1,用於記錄最長公共子串行長度 xlen x.length ylen y.length int c xlen 1 ylen 1 接著是n陣列,記錄方向,我用0代表左,1代表上,...
O nlogn LIS及LCS演算法
morestep學長出題,考驗我們,第二題裸題但是資料範圍令人無奈,考試失利之後,刻意去學習了下優化的演算法 一 o nlogn 的lis 最長上公升子串行 設當前已經求出的最長上公升子串行長度為len。先判斷a t 與d len 若a t d len 則將a t 接在d len 後將得到乙個更長的...