public static int MaxTwoArraySameOrderMethod(String str1,String str2) {
int m = str1.length();
int n = str2.length();
/*
* 定义一个二维数组保存公共子序列长度
* dp[i][j]表示字符串1从头开始长度是i,字符串2从头开始长度是j,这两个字符串的最长公共子序列的长度
* 设置数组行列比他们长度大一。往二维数组中填写数字时,每个位置的数字跟他上方或者左方或者左上方数字有关系,这样处理边界数字时不用处理这种情况,方便接下来的循环
*/
int dp[][] = new int[m+1][n+1];
/*
* 初始化第一行第一列
* dp[0,j]表示啥?表示字符串1的长度是0,字符串2的长度是j,这两个字符串的最长公共子序列的长度是0,因为,字符串1 根本就没有嘛
*/
for(int i=0;i<=m;i++){
dp[i][0] = 0;
}
for(int i=0;i<=n;i++){
dp[0][i] = 0;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
/*
* 如果当c[i][j]时,字符串1从头开始长度是i,字符串2从头开始长度是j时他们最后一个字符相同
* 就同时把他们向前移动一位,找c[i-1][j-1]时长度最大的再加一
* 表现在二维数组中就是c[i][j]左上方的点
*/
if(str1.charAt(i-1) == str2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
/*
* 如果当c[i][j]时,他们最后一个字符不相同
* 要将str1往前移动一位的c[i-1][j]的lcs长度,或者将str2往前移动一位的c[i][j-1]的lcs长度
* 哪个长,将它赋给c[i][j]
* 表现在二维数组中就是c[i][j]上方的点或者左方的点
*/
}else{
dp[i][j] = Math.max(dp[i][j-1], dp[i-1][j]);
}
}
}
return dp[m][n];
}