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...