两个字符串,求最长公共子序列,则用到的肯定是第二种方法,dp[i][j]表示的是0到i和0到j中最长的子序列,然后再定义0位置为空串,则都应该初始化为0,然后dp[i][j]怎么求呢,两个指针从后往前走,如果相同则lcs+1,且i和j都减1,dp[i][j]=dp[i-1][j-1],如果不同,则要扔掉一个,选择这其中比较大的一种情况,那为什么不会都扔掉的,因为dp[i-1][j-1]无论如何都是最小的一个,不可能取到它,所以没有必要参加比较。所以dp[i][j]=dp[i-1][j-1]+1或者是dp[i-1][j]或者是dp[i][j-1]中的最大值
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
if(text1.length()==0 || text2.length()==0)return 0;
char[] s1=text1.toCharArray();
char[] s2=text2.toCharArray();
int[][] dp=new int[s1.length+1][s2.length+1];
for(int i=1;i<=s1.length;i++){
for(int j=1;j<=s2.length;j++){
if(s1[i-1]==s2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[s1.length][s2.length];
}
}