給定兩個字串,求最長公共子串行lcs。
也就是說兩個字串中都有的部分,或者理解為,兩個字串同時都刪除字串中的某些字元,使得最終的兩個字串,相等,且是最長的。
假設兩個str1,str2字串,已經知道了最長公共子串行長度為l
那麼,當在str1和str2,兩個的尾部,同時新增乙個相同的字元,比如a,那麼新的str1,和str2的最長公共子串行長度就是l+1
當str1後面新增乙個字元,str2不新增,那麼最長公共子串行長度為l
反之,str1不新增,str2新增,那麼也是l
當同時新增乙個字元,但是新增不同的字元,那麼長度仍為l
因此,可以考慮
int lcs(string str1, string str2)else
else}}
}return memo[len1][len2];
}
或者說,也可以這樣考慮,
str1,和str2,當最後乙個字元相同,那麼,str1,和str2的最長公共子串行的長度應該是,str-1和str2-1的最長公共子串行長度+1
當最後乙個字元不相同的時候,那麼,str1,和str2的最長公共子串行的長度應該是(str1-1和str2)與(str1和str2-1)的最長公共子串行長度的較大的那個。
但是這樣計算大量相同的問題,因此加上memo
int aux_lcs_d(string str1, int l1, string str2, int l2,vector> &memo)if(memo[l1][l2] != 0)
if (str1[l1] == str2[l2])
else
}int lcs_d(string str1,string str2)
以上就是計算lcs長度的思路.
當需要計算出完成的路徑時。新增乙個額外的容器,記錄,每個狀態是怎麼從前乙個狀態轉移過來的
int aux_lcs_d(string str1, int l1, string str2, int l2,vector> &memo,vector> &path)if(memo[l1][l2] != 0)
if (str1[l1] == str2[l2])
else
else
return memo[l1][l2];
}}
最長公共子串行LCS(動態規劃)
1.描述 給定兩個序列 x y 求x和y的乙個最長公共子串行。2.分析 設最長子序列 z 則 1 若 xm yn 則 zk xm yn,且z k 1 是 x m 1 和 y n 1 的最長公共子串行 2 若 xm yn 且 zk xm 則 z 是 x m 1 和 y 的最長公共子串行 3 若 xm ...
最長公共子串行(LCS) 動態規劃
首先,動態規劃的關鍵是將之前所計算的結果儲存起來,之後直接呼叫!1.問題描述 字串的子串行 是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行 是指多個字串可具有的長度最大的公共的子串行。比如 adbcbd bdcaba這兩個字串的最長公共子串行是dcb 2....
動態規劃 最長公共子串行(LCS)
最長公共子串行也是動態規劃中的乙個經典問題。有兩個字串 s1 和 s2,求乙個最長公共子串,即求字串 s3,它同時為 s1 和 s2 的子串,且要求它的長度最長,並確定這個長度。這個問題被我們稱為最長公共子串行問題。與求最長遞增子串行一樣,我們首先將原問題分割成一些子問題,我們用 dp i j 表示...