面試算法--【動態(tài)規(guī)劃】LCS算法:求兩字符串最大公共字符串(不連續(xù))

一拭卿、動態(tài)規(guī)劃法

經(jīng)常會遇到復雜問題不能簡單地分解成幾個子問題杖狼,而會分解出一系列的子問題。簡單地采用把大問題分解成子問題颈畸,并綜合子問題的解導出大問題的解的方法,問題求解耗時會按問題規(guī)模呈冪級數(shù)增加没讲。為了節(jié)約重復求相同子問題的時間眯娱,引入一個數(shù)組,不管它們是否對最終解有用爬凑,把所有子問題的解存于該數(shù)組中徙缴,這就是動態(tài)規(guī)劃法所采用的基本方法。

二嘁信、問題:求兩字符序列的最長公共字符子序列(LCS)

問題描述:字符序列的子序列是指從給定字符序列中隨意地(不一定連續(xù))去掉若干個字符(可能一個也不去掉)后所形成的字符序列于样。令給定的字符序列X=“x0,x1潘靖,…穿剖,xm-1”,序列Y=“y0卦溢,y1糊余,…秀又,yk-1”是X的子序列,存在X的一個嚴格遞增下標序列<i0贬芥,i1吐辙,…,ik-1>蘸劈,使得對所有的j=0昏苏,1,…昵时,k-1捷雕,有xij=yj。例如壹甥,X=“ABCBDAB”救巷,Y=“BCDB”是X的一個子序列。

三句柠、分析

考慮最長公共子序列問題如何分解成子問題浦译,設A=“a0,a1溯职,…精盅,am-1”,B=“b0谜酒,b1叹俏,…,bm-1”僻族,并Z=“z0粘驰,z1,…述么,zk-1”為它們的最長公共子序列蝌数。不難證明有以下性質(zhì):

  • (1) 如果am-1=bn-1,則zk-1=am-1=bn-1度秘,且“z0顶伞,z1,…剑梳,zk-2”是“a0唆貌,a1,…垢乙,am-2”和“b0挠锥,b1,…侨赡,bn-2”的一個最長公共子序列蓖租;

  • (2) 如果am-1!=bn-1粱侣,則若zk-1!=am-1,蘊涵“z0蓖宦,z1齐婴,…,zk-1”是“a0稠茂,a1柠偶,…,am-2”和“b0睬关,b1诱担,…,bn-1”的一個最長公共子序列电爹;

  • (3) 如果am-1!=bn-1蔫仙,則若zk-1!=bn-1,蘊涵“z0丐箩,z1摇邦,…,zk-1”是“a0屎勘,a1施籍,…,am-1”和“b0概漱,b1丑慎,…,bn-2”的一個最長公共子序列瓤摧。

這樣立哑,在找A和B的公共子序列時,如有am-1=bn-1姻灶,則進一步解決一個子問題,找“a0诈茧,a1产喉,…,am-2”和“b0敢会,b1曾沈,…,bm-2”的一個最長公共子序列鸥昏;如果am-1!=bn-1塞俱,則要解決兩個子問題,找出“a0吏垮,a1障涯,…罐旗,am-2”和“b0,b1唯蝶,…九秀,bn-1”的一個最長公共子序列和找出“a0,a1粘我,…鼓蜒,am-1”和“b0,b1征字,…都弹,bn-2”的一個最長公共子序列,再取兩者中較長者作為A和B的最長公共子序列匙姜。

四畅厢、求解

引進一個二維數(shù)組c[][],用c[i][j]記錄X[i]與Y[j] 的LCS 的長度搁料,b[i][j]記錄c[i][j]是通過哪一個子問題的值求得的或详,以決定搜索的方向。
我們是自底向上進行遞推計算郭计,那么在計算c[i,j]之前霸琴,c[i-1][j-1],c[i-1][j]與c[i][j-1]均已計算出來昭伸。此時我們根據(jù)X[i] = Y[j]還是X[i] != Y[j]梧乘,就可以計算出c[i][j]。

問題的遞歸式寫成:

圖片.png
圖片.png

example:

public class WDLCS {
    public int findLCS(String A, String B) {
        int n = A.length();
        int m = B.length();
        char[] a = A.toCharArray();
        char[] b = B.toCharArray();
        int[][] dp = new int[n][m];
        for (int i = 0; i < n; i++) {//第一列
            if (a[i] == b[0]) {
                dp[i][0] = 1;
                for (int j = i + 1; j < n; j++) {
                    dp[j][0] = 1;
                }
                break;
            }
        }

        for (int i = 0; i < m; i++) {//第一行
            if (a[0] == b[i]) {
                dp[0][i] = 1;
                for (int j = i + 1; j < m; j++) {
                    dp[0][j] = 1;
                }
                break;
            }
        }
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (a[i] == b[j]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.out.print(dp[i][j] + " ");
            }
            System.out.println();
        }
        return dp[n - 1][m - 1];
    }

    public static void main(String[] args) {
        WDLCS lcs = new WDLCS();
        //int findLCS = lcs.findLCS("object", "wdobject");
        int findLCS = lcs.findLCS("object", "wobjedct");
        System.out.println("最長子序列長度:" + findLCS);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庐杨,一起剝皮案震驚了整個濱河市选调,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灵份,老刑警劉巖仁堪,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異填渠,居然都是意外死亡弦聂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門氛什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺葫,“玉大人,你說我怎么就攤上這事枪眉∞嗝剩” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵贸铜,是天一觀的道長堡纬。 經(jīng)常有香客問我聂受,道長,這世上最難降的妖魔是什么隐轩? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任饺饭,我火速辦了婚禮,結(jié)果婚禮上职车,老公的妹妹穿的比我還像新娘瘫俊。我一直安慰自己,他們只是感情好悴灵,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布扛芽。 她就那樣靜靜地躺著,像睡著了一般积瞒。 火紅的嫁衣襯著肌膚如雪川尖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天茫孔,我揣著相機與錄音叮喳,去河邊找鬼。 笑死缰贝,一個胖子當著我的面吹牛馍悟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剩晴,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼锣咒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赞弥?” 一聲冷哼從身側(cè)響起毅整,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绽左,沒想到半個月后悼嫉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拼窥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年戏蔑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯团。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仙粱,靈堂內(nèi)的尸體忽然破棺而出房交,到底是詐尸還是另有隱情,我是刑警寧澤伐割,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布候味,位于F島的核電站刃唤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏白群。R本人自食惡果不足惜尚胞,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帜慢。 院中可真熱鬧笼裳,春花似錦、人聲如沸粱玲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抽减。三九已至允青,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卵沉,已是汗流浹背颠锉。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留史汗,地道東北人琼掠。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像淹办,于是被迫代替她去往敵國和親眉枕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容