演算法 求兩個字串的最長公共子串行(LCS問題)

2021-09-11 03:53:38 字數 1442 閱讀 2022

參考:

給定兩個字串,求解這兩個字串的最長公共子串行(longest common sequence)。比如字串1:bdcaba;字串2:abcbdab

則這兩個字串的最長公共子串行長度為4,最長公共子串行是:bcba

動態規劃:

dp[i+1][j+1]表示截止到字串a的i,字串b的j位置的最長公共子串行長度;

dpstr[i+1][j+1]表示截止到a的i,b的j位置的最長公共子串行

多申請一行一列的空間是為了**實現方便

若a.charat(i) == b.charat(j),則dp[i ][j] = dp[i-1][j-1] + 1

若a.charat(i) != b.charat(j),則dp[i][j] = max(dp[i][j-1],dp[i-1][j])

import org.apache.commons.lang3.randomstringutils;

import org.junit.test;

import org.junit.experimental.theories.fromdatapoints;

/** * author: zxh

* date: 2019/2/12 14:31

* email:

* desc:

*/public class testdynamicplanlcsself

for (int i = 0; i <= blength; i++)

for (int i = 0; i < alength; i++) else }}

system.out.println("最長公共子串行長度:"+dp[alength][blength]);

system.out.println("最長公共子串行之一:"+dpstr[alength][blength]);

system.out.println("dp詳情:");

for (int i = 0; i < alength; i++)

system.out.println();}}

}

9516880829

419112660861270

最長公共子串行長度:6

最長公共子串行之一:916082

dp詳情:

000000000000000

000111111111111

000111111111111

001122222222222

001122233333333

001122233344444

001122233344444

001122233444444

001122233455555

001122333455566

process finished with exit code 0

求兩個字串的最長公共子串

問題 有兩個字串str和str2,求出兩個字串中最長公共子串長度。比如 str acbcbcef,str2 abcbced,則str和str2的最長公共子串為bcbce,最長公共子串長度為5。演算法思路 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的...

求兩個字串的最長公共子串

def longestcommonsequence str one,str two,case sensitive true str one 和 str two 的最長公共子串行 param str one 字串1 param str two 字串2 正確結果 param case sensitive...

求兩個字串的最長公共子串

採用乙個二維矩陣來記錄中間結果,矩陣的橫座標為字串1的各個字元,矩陣的縱座標為字串2的各個字元。舉例說明 假設兩個字串分別為 bab 和 caba 當然我們現在一眼就可以看出來最長公共子串是 ba 或 ab b a b c 0 0 0 a 0 1 0 b 1 0 1 a 0 1 0 可以看出,矩陣的...