最长公共子序列:
字符串a:"android"。
字符串b:"random"。
最长公共子序列为:ando
最长连续公共子序列为:and,因为o和and之间隔开了。
思想:使用动态规划法,用一个二维数组,i 行表示当前选中s1的前 i 字符,列 j 表示当前选中s2的前 j 个字符,dp[i][j]表示当前i和j情况下最大子序列有多少个。(连续子序列使用max来保存最大)。
动态规划递推公式:
a.charAt( i )== b.chaiAt( j )时,dp[i][j] = dp [i-1][j-1] + 1;
其他时候,dp[i][j] = max(dp[i-1][j] , dp[i][j-1]);
代码如下:
package 动态规划;
public class LCS {
//最长公共子序列
public static void findLCS(String a ,String b) {
int s1len = a.length();
int s2len = b.length();
char[] s1 = a.toCharArray();
char[] s2 = b.toCharArray();
int[][] lcs = new int[s1len][s2len];
//把第一行写好
int flag = 0;
for (int i = 0; i < s2len ; i++) {
if (s1[0] == s2[i]) {
flag = 1;
}
lcs[0][i] = flag;
}
//吧第一列写好