最长公共子序列与最长连续公共子序列(java)——动态规划法

最长公共子序列:

字符串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;
		}
		//吧第一列写好