2018-08-09

動態(tài)規(guī)劃之最長公共子序列

問題描述

給定兩個字符串,求解兩個字符串的最長公共子序列。比如字符串1:BDCABA;字符串2:ABCBDAB批糟,則這兩個字符串的最長公共子序列長度為4,最長公共子序列是:BCBA

算法求解

設 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是兩個序列捏雌,將 X 和 Y 的最長公共子序列記為LCS(X,Y)
找出LCS(X,Y)就是一個最優(yōu)化問題。因為笆搓,我們需要找到X 和 Y中最長的那個公共子序列性湿。而要找X 和 Y的LCS,首先考慮X的最后一個元素和Y的最后一個元素满败。
1)如果 xn=ym肤频,即X的最后一個元素與Y的最后一個元素相同,這說明該元素一定位于公共子序列中算墨。因此宵荒,現(xiàn)在只需要找:LCS(Xn-1,Ym-1)
LCS(Xn-1净嘀,Ym-1)就是原問題的一個子問題报咳。為什么叫子問題?因為它的規(guī)模比原問題小挖藏。(小一個元素也是小嘛....)
為什么是最優(yōu)的子問題暑刃?因為我們要找的是Xn-1 和 Ym-1 的最長公共子序列啊。膜眠。岩臣。最長的!O颉架谎!換句話說,就是最優(yōu)的那個辟躏。(這里的最優(yōu)就是最長的意思)
2)如果xn != ym谷扣,這下要麻煩一點,因為它產生了兩個子問題:LCS(Xn-1捎琐,Ym) 和 LCS(Xn抑钟,Ym-1)
因為序列X 和 序列Y 的最后一個元素不相等嘛,那說明最后一個元素不可能是最長公共子序列中的元素嘛野哭。在塔。
LCS(Xn-1,Ym)表示:最長公共序列可以在(x1,x2,....x(n-1)) 和 (y1,y2,...yn)中找拨黔。
LCS(Xn蛔溃,Ym-1)表示:最長公共序列可以在(x1,x2,....xn) 和 (y1,y2,...y(n-1))中找。
求解上面兩個子問題,得到的公共子序列誰最長贺待,那誰就是 LCS(X,Y)徽曲。用數(shù)學表示就是:
LCS=max{LCS(Xn-1,Ym)麸塞,LCS(Xn秃臣,Ym-1)}
由于條件 1) 和 2) 考慮到了所有可能的情況。因此哪工,我們成功地把原問題 轉化 成了 三個規(guī)模更小的子問題奥此。

代碼求解

public class LCSLength {
    public static void lcsLength(int m,int n, char[] x,char[] y,int[][]c,int[][]b){
        int i,j;
        for(i=1;i<=m;i++)c[i][0]=0;
        for(j=1;j<=n;j++)c[0][j]=0;
        for(i=1;i<=m;i++){
            for(j=1;j<=n;j++){
                if(x[i]==y[j]){
                    c[i][j]=c[i-1][j-1]+1; //兩個字符串的最后一個字母相同,根絕遞推式得到此關系
                    b[i][j]=1; //用b[i][j]記錄是哪一種情況雁比,后面在構造最長公共字串有用
                }
                   // 兩個字符串最后一個字母不相同的情亂
                else if(c[i-1][j]>c[i][j-1]){
                    c[i][j]=c[i-1][j];
                    b[i][j]=2;
                }
                else{
                    c[i][j]=c[i][j-1];
                    b[i][j]=3;
                }
            }
        }
        System.out.println(c[m][n]);
        
    }
   //構造最長公共字串
    public static void LCS(int i,int j,char[]x,int[][]b){
        if(i==0||j==0) return;
        if(b[i][j]==1){
            LCS(i-1,j-1,x,b);
            System.out.print(x[i]+" ");
        }
        else if(b[i][j]==2)
            LCS(i-1,j,x,b);
        else 
            LCS(i,j-1,x,b);
    }
    public static void main(String[] args){
        char[] x = {'0','A','B','C','B','D','A','B'};
        char[] y = {'0','B','D','C','A','B','A'};
        int[][] c = new int[x.length][y.length];
        int[][] b = new int[x.length][y.length];
        lcsLength(7,6,x,y,c,b);
        LCS(7,6,x,b);
    }
}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末稚虎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子偎捎,更是在濱河造成了極大的恐慌蠢终,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴她,死亡現(xiàn)場離奇詭異寻拂,居然都是意外死亡,警方通過查閱死者的電腦和手機丈牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門兜喻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赡麦,你說我怎么就攤上這事朴皆。” “怎么了泛粹?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵遂铡,是天一觀的道長。 經(jīng)常有香客問我晶姊,道長扒接,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任们衙,我火速辦了婚禮钾怔,結果婚禮上,老公的妹妹穿的比我還像新娘蒙挑。我一直安慰自己宗侦,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布忆蚀。 她就那樣靜靜地躺著矾利,像睡著了一般姑裂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上男旗,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天舶斧,我揣著相機與錄音,去河邊找鬼察皇。 笑死茴厉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的什荣。 我是一名探鬼主播矾缓,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溃睹!你這毒婦竟也來了而账?” 一聲冷哼從身側響起胰坟,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤因篇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笔横,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竞滓,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年吹缔,在試婚紗的時候發(fā)現(xiàn)自己被綠了商佑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡厢塘,死狀恐怖茶没,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情晚碾,我是刑警寧澤抓半,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站格嘁,受9級特大地震影響笛求,放射性物質發(fā)生泄漏。R本人自食惡果不足惜糕簿,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一探入、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懂诗,春花似錦蜂嗽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荚醒。三九已至,卻和暖如春隆嗅,著一層夾襖步出監(jiān)牢的瞬間界阁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工胖喳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泡躯,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓丽焊,卻偏偏與公主長得像较剃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子技健,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內容

  • iOS面試中熟悉常見算法 1写穴、 對以下一組數(shù)據(jù)進行降序排序(冒泡排序)〈萍“24啊送,17,85欣孤,13馋没,9,54降传,76篷朵,...
    修一辰閱讀 422評論 0 0
  • 探探VS積木 用戶體驗分析 一、產品信息 1.1產品名稱:探探&積目 1.2版本號:3.1.1&2.1.9 1.3...
    旺仔小牛奶666閱讀 3,814評論 0 3
  • 本文章只適合初學者婆排,勿噴實驗適用于 5 .6. 7 版本實驗是在虛擬機上進行的 掛載光盤LINUX 7 啟動服務 ...
    Adrain大主教閱讀 1,004評論 0 2
  • 在我看來段只,四十歲并非困惑的結束腮猖,而是困惑的深入。只有困惑翼悴,才能把我們引領到新的人生高度缚够。 一個四十歲的人給你提個醒...
    zxk在路上閱讀 297評論 0 1
  • 上周做了一份部門綜合季度匯報材料,做完后交給領導審查鹦赎,領導說文字內容沒問題谍椅,讓我把版面美化一下,這樣不會顯得太枯燥...
    我是水哥閱讀 363評論 0 0