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

2021-05-27 14:56:42 字數 1154 閱讀 9102

記字串xi和yj的lcs的長度為c[i,j](c[i][j] 代表了長度為i的x子串和長度為j的y子串的lcs的長度),我們可以遞迴地求c[i,j]:

/      0                               if i<0 or j<0

c[i,j]=          c[i-1,j-1]+1                    if i,j>=0 and xi=xj

\       max(c[i,j-1],c[i-1,j]           if i,j>=0 and xi≠xj

在求得矩陣c[i,j] 後,可以逆向求得lcs:當c[i,j] = c[i-1][j-1] + 1 時,則x[i] = y[j] 是 lcs的乙個字元。

//遞迴求得lcs的長度:c[i][j] 代表字串a[0-i]和b[0-j]的lcs的長度

public static void lcs(char a, char b, ref int c)

else

}//初始化c[0][j]

for (int j = 0; j < b.length; j++)

else

}//遞迴求得lcs的長度:c[i][j]

for (int i = 1; i < a.length; i++)

else if (c[i - 1][j] >= c[i][j - 1])

else}}

}//逆向根據c[i][j],求得乙個lcs

public static void printlcs(char a, char b, int c, int i, int j)

]=b=", i, j, a[i]);

}return;

}if (c[i][j] == c[i][j - 1])

else if (c[i][j] == c[i - 1][j])

else

]=b=", i, j, a[i]);

printlcs(a, b, c, i - 1, j - 1);}}

static int main(string args)

console.writeline("");

}printlcs(a, b, c, a.length - 1, b.length - 1);

}

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

問題 有兩個字串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 可以看出,矩陣的...