最長公共子串行問題

2021-08-05 22:26:59 字數 2380 閱讀 5646

輸入

第1行:字串a

第2行:字串b

(a,b的長度 <= 1000)

輸出

輸出最長的子串行,如果有多個,隨意輸出1個。

輸入示例

abcicba

abdkscab

輸出示例

abca

其實對於最長公共子串行的問題,網上都有非常非常多平易近人、好的教程,在這裡就不多贅述啦~只想和大家分享一些我看完之後的小體會。

最長公共子串行其實也是一道動態規劃的題目。是動態規劃的題目那麼肯定就有屬於它的狀態轉移方程。

針對它的動態轉移方程,其實也可以用我們之前說道的「潛在終點」的思維。

首先,我們有兩個序列 

a1 a2 a3......am

b1b2 b3......bn

首先我們需要明確的是,a和b序列長度不一定一樣噢!

然後我們分別取兩個序列中的子串(連續的)

a1.......ax

b1.......by

我們想想,這兩個子串都是連續的,而且各自有自己的結尾,ax和by,作為自己的「終點元素」,倘若,ax=by,是不是說明,我們針對這兩個子串的最長公共子串行一定要包含這個元素?

我們不妨用lcd(ax,by)來表示,當前兩個子串的最長公共子串行。是不是lcd(ax,by)=lcd(ax-1,by-1)

wait a minute

是不是快暈了。

不要著急,我們想一下,因為ax=by,所以我們不管它們啦,它們的恩恩怨怨愛恨離愁都不管了,因為肯定要包含的。

假如我們不包含它

那麼我們針對這兩個子串的最長公共子串行再加上ax或者by,是不是還能形成「更長」的公共子串行,所以矛盾。所以我們的最長公共子串行必須要以ax或者by結尾。

然後,假如我們的ax不等於by呢?

也就是說,我們的lcd(ax,by)的「終點元素」可能

等於ax不等於by

等於by不等於ax

既不等於ax也不等於by

wait a minute

是不是快暈了

我們放下腳步,我們現在要求最長公共子串行對吧,

因為我們拿不準,究竟是取ax還是取by還是兩個都不取我們的最終元素。那麼我們圍繞最長,是不是應該做乙個比較,例如序列abc和ccd,c和d不相等噢!那麼我們就比較一下嘛,看一下

abc和cc(ccd忽略了d,假設不關d的事)的最長公共子串行-----c 長度為1

ab(abc忽略了c,假設不關c的事)

和ccd的最長公共子串行------長度為0

所以此時我們取大的,最長公共子串行為c,長度為1

或許你還是不服氣,說我們只考慮了不等於ax等於by或者等於ax不等於by的情況啊,如果兩個都不等於呢?為什麼不來個ax-1,by-1

我們來分析一下

lcd ax-1,by-1和lcd ax-1,by和lcd ax,by-1有沒有比較的必要。。。。。。

你覺得ax-1,by-1的最長公共子串行會比它們長嗎。。。。。。

我覺得肯定不可能吧

而且,我們

好了,我們得到了我們的狀態轉移方程,有沒有覺得它像乙個東西。。。。。。

沒錯,它跟矩陣取數有點像,都是可能根據左方和上方,在這裡還可能根據「斜上方」,但是做法大同小異。

因為要追蹤生成的最大公共子串行是多少,所以我定義了個road陣列,如果上 左對應了1和4

左上方代表了5;

然後為了整體的下標統一,我把一開始輸入的a和b都往後挪了個位置。

#include#includeusing namespace std;

int dp[1001][1001];

int road[1001][1001];

int main()

for(int i=a.size()-1;i>=1;i--)

for(int i=b.size()-1;i>=1;i--)

for(int j=0;j<1001;j++)

dp[0][j]=0;

for(int i=0;i<1001;i++)

dp[i][0]=0;

int l1=a.size();

int l2=b.size();

for(int i=1;i=dp[i][j-1])

else}}

}for(int i=a.size()-1,j=b.size()-1;i>0&&j>0;)

if(road[i][j]==4)

if(road[i][j]==5)

}for(int i=common.size()-1;i>=0;i--)

cout《希望可以幫助到大家

最長公共子串行問題

給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...

最長公共子串行問題

最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...

最長公共子串行問題

問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...