演算法學習 LSC最大公有子串行 java實現

2021-06-21 09:26:55 字數 1571 閱讀 4215

package com.stone.study.core;

/** *

* @classname lsc

* @description todo

* 最長公有子串行

* 演算法型別:動態規劃

* * 問題描述:如果字串一的所有字元按其在字串中的順序出現在另外乙個字串二中,則字串一稱之為字串二的子串。

* 注意,並不要求子串(字串一)的字元必須連續出現在字串二中。

* 請編寫乙個函式,輸入兩個字串,求它們的最長公共子串,並列印出最長公共子串。

* 例如:輸入兩個字串bdcaba和abcbdab,字串bcba和bdab都是是它們的最長公共子串行,則輸出它們的長度4,並列印任意乙個子串行。

* * 轉移方程:

* dp[i,j] = 0 i=0 || j=0

* dp[i,j] = dp[i-1][j-1]+1 i>0,j>0, a[i] = b[j]

* dp[i,j] = max(dp[i-1][j],dp[i][j-1]) i>0,j>0, a[i] != b[j]

* * @author stone

* @date:2014-4-3上午10:34:16

*/public class lsc ;

public static char s2 = ;

/*** c[i][j]儲存s1第0到i之間的字串與s2第0到j之間的字串,最長公有子串長度,因此c為[s1.length+1][s2.length+1]

*/static int c = new int[s1.length + 1][s2.length + 1];

/*** b[i][j]儲存s1中第0到i之間的字串與s2第0到j之間的字串,最後乙個字元針對最長公有子串的比較結果

*/static char b = new char[s1.length + 1][s2.length + 1];

public static void main(string args)

/*** 計算子問題結果,並存入c陣列中

*/public static void lsc()

for (int j = 0; j < c[0].length; j++)

int m = s1.length + 1;

int n = s2.length + 1;

for (int i = 1; i < m; i++) else if (c[i][j - 1] >= c[i - 1][j]) else

}} system.out.println(c[m-1][n-1]);

} /**

* 根據b陣列中儲存的結果路徑,列印子串

*/public static void printlsc() else if (b[i][j] == '上') else

} system.out.println(stringbuilder.reverse().tostring());

}}

筆試演算法學習 最大連續子串行和

例如給定序列,其最大連續子串行為,最大和 為20。1 動態規劃,dp i 中儲存前i 1個數的最大和 include includeusing namespace std int main int sum 0 然後通過逆過程,找到最大值所對應的左下標 for int i right i 0 i fo...

演算法學習 最長公共子串行

題目 給定乙個字串s,你可以從中刪除一些字元,使得剩下的串是乙個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字元個數。利用回文串的特點,正串和反串相同,求兩者的最大公共子串行,原長度減去最大公共子串行長度即為需要刪除的字元個數 最大公共子串行 abcde 和acfef 為最大公共子串行 利用...

演算法學習 最大連續子陣列

題目 給定乙個陣列a 0,n 1 求a的連續子陣列,使得孩子陣列的和最大。例如陣列 1,2,3,10,4,7,2,5的最大子陣列是 3,10,4,7,2 分析 記s i 為以a i 為結尾的陣列中和最大的子陣列 則 s i 1 max s i a i 1 a i 1 s 0 a 0 遍歷i 0 i ...