leecode地址
力扣https://leetcode-cn.com/problems/longest-common-subsequence/
/**
*
* 匹配模型:
* 思路:
*
* 最长公共子序列
* 思路:
* dp[i][j]代表字符串1(0到i-1,长度为i),字符串2(0到j-1,长度为j)的匹配结果
* 如果i-1=j-1,那么dp[i][j]可以从[i-1][j],[i][j-1],[i-1][j-1]过来
* 如果i-1!=j-1,那么dp[i][j]可以从[i-1][j]或者是[i][j-1]过来
* 分别取max,得到最终的结果
* dp[n+1][n+1],dp[0][0]不代表任何字符
*
*/
public int longestCommonSubsequence(String text1, String text2) {
int n = text1.length();
int m = text2.length();
if (n==0 || m ==0){
return 0;
}
int[][] dp = new int[n+1][m+1];
for (int i = 0; i <= n; i++){
dp[i][0] = 0;
}
for (int i = 0; i <= m; i++){
dp[0][i] = 0;
}
char[] c1 = text1.toCharArray();
char[] c2 = text2.toCharArray();
for (int i = 1; i <= n; i++){
for (int j = 1; j<= m; j++){
if (c1[i-1] == c2[j-1]){
dp[i][j] = Math.max(Math.max(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]+1);
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[n][m];
}