解题思路
先谈谈最基本的二维的做法
状态转移方程:
当(s1[i]==s2[j])//这里不需要取最大值是因为这个值就已经是当前可取到的最大值了
dp[i][j]=dp[i-1][j-1]+1
当(s1[i]!=s2[j])//一个i-1,一个j-1,意思就是得到当前取到的s1和s2的两个子串的公共子序列长度的最大值,算是得到小状态的最优解了
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
然后再谈谈这里可以用到的滚动数组
我们可以发现 在二维数组的使用中,实际上只有某一行和他的上一行进行了数据的互动,所以可以省略掉数组的一个维度,而使用一个在反复迭代的一维数组
这里对于两字符比较为不相同时的dp[i-1][j]和dp[i][j-1],仔细想想就会知道完全直接抛掉一维是没有问题的
但是对于比较为相同时,这时用到了左上角的数据,这时采取迭代存储这个数据就行了
代码
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int[] dp = new int[text2.length()+1];
int len1=text1.length(),len2=text2.length();
for(int i=1;i<=len1;i++){
int lr=dp[0];
for(int j=1;j<=len2;j++){
int temp=dp[j];
if(text1.charAt(i-1)==text2.charAt(j-1)){
dp[j]=lr+1;
}else{
dp[j]=Math.max(dp[j-1],dp[j]);
}
lr=temp;
}
}
return dp[text2.length()];
}
}