輸入
第1行:字串a第2行:字串b
(a,b的長度 <= 1000)
輸出
輸出最長的子串行,如果有多個,隨意輸出1個。
輸入示例
abcicbaabdkscab
輸出示例
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...