推薦 最長不降子串行與最長公共子串行

2021-05-25 06:32:33 字數 1802 閱讀 1509

d一、字串刪字元後最長不降子串行

1.問題描述

請在字串「uxdqirqfjeuuryhkntuvpbyidyxqcxitpvsnskwjiijtz「中刪除若干個字元後,餘下的字元構成不降子串行(即序列從第2個字元開始,每乙個字元的ascii碼不小於它前面字元的ascii碼)。求最長的不降子串行。

2.設計要點

給定乙個由n個字元組成的字串,從字串中刪除若干個字元後,使剩下的字串構成非子串行。設字串的各個字元a(1),a(2),...,a(n),對每乙個字元操作(刪除還是不刪)為乙個階段,共為n個階段。

⑴建立遞推關係

設定b陣列,b(i)表示序列的第i個字元到最後第n個字元的最長非降子串行的長度,i=1,2,...,n。對所有j>i,比較當a(i)<=a(j)時的所有b(j)的最大值,顯然b(i)為這一最大值加1,表示加上a(i)本身這一項。

因而有遞推關係:

b(i)=max(b(j))+1   (a(i)<=a(j), 1<=i

⑵逆推計算最優值

逆推依次求得b(n-1),...,b(1),比較這n-1個值得其中的最大值lmax,即為所求的最長非降子串行的長度,即最優值

⑶構造最優解

從序列的第1項開始,依次輸出b(i)分別等於lmax,lmax-1,...,1且a(i)不小於其前面輸出項a(j),這就是所求的乙個最長非降子串行。

3.**實現

二、最長公共子串行

1.問題提出

乙個序列的子串行是在該序列中刪去若干項後所得到的序列。例如,"bcba"是"abcbdab"和"bdcaba"的公共子串行。給定兩個序列x=和y=,找出序列x和y的最長公共子串行。

2.設計要點

最長公共子串行問題具有最優子結構性質,應用動態規劃設計求解。

⑴建立遞推關係

設序列x=和y=的最長公共子串行為z=,與 (i=1, ..., m; j=1, ..., n)的最長公共子串行的長度為c(i,j)。

若i=m+1或j=n+1,此時為空序列,c(i, j)=0(邊界條件)。

若x(1)=y(1),則有z(1)=x(1),c(1,1)=c(2,2)+1(其中1為z(1)這一項)。

若x(1)!=y(1),則c(1,1)取c(2,1)與c(1,2)中的較大者。

一般地,有遞推關係:

若x(i)=y(i),則c(i,j)=c(i+1,j+1)+1   (1<=i<=m, 1<=j<=n);

若x(i)!=y(i),則c(i,j)=max(c(i+1,j),c(i,j+1))。

邊界條件:c(i,j)=0    (i=m+1或j=n+1)

⑵逆推計算最優值

根據以上遞推關係,逆推計算最優值c(1,1)流程為:

⑶構造最優值

為構造最優值,即最優救出最長最長公共子串行,設定陣列s(i,j),當x(i)=y(j)時s(i,j)=1;當x(i)!=y(j)時s(i,j)=0。

x序列的每一項與y序列的每一項逐一比較,根據s(i,j)與c(i,j)取值具體構造最長公共子串行。

實施x(i)與y(j)比較,其中i=1,2,...,m;j=1,2,...,n;變數t從0開始取值,當確定最長公共子串行一項時,t=j+1。這樣處理可避免重複取項。

若s(i, j)=1且c(i,j)=c(1,1)時,取x(i)為最長公共子串行的第1項;

隨後,若s(i,j)=1且c(i,j)=c(1,1)-1時,取x(i)最長公共子串行的第2項;

一般地,若s(i,j)=1且c(i,j)=c(1,1)-2時(w從0開始,每確定最長公共子串行的一項,w增1),取x(i)最長公共子串行的第w+1項。

構造最長公共子串行描述:

⑶**實現

最長公共子串行 與 最長公共子串

最長公共子串行 常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。最長公共子串 是指在母串中連續出現的子串。例如 cnblogs belong 最長公共子串行為blog,最長公共子串為lo假設z z2,zk 是母串 x 與 y的最長公共子串行lcs,那麼 用...

最長公共子串與最長公共子串行

一 最長公共子串 longest common substring 遍歷的時候用乙個二維陣列儲存相應位置的資訊,如果兩個子串1與子串2相應位置相等 則看各自前乙個位置是否相等,相等則該位置值b i j b i 1 j 1 1,不相等則置為1。如果兩個子串1與子串2相應位置不相等,則b i j 0。如...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...