思路
1、考虑从后往前推导,随着字符串的变长,两个字符串的最后一个字符相同或者不同,对最长公共子序列的长度影响。
2、使用arr[i][j]表示text1的前i个字符和text2的前j个字符的最长公共子序列长度,得到以下状态转移方程:
若text1的第i个字符和text2的第j个字符相同,则
arr[i][j] = arr[i - 1][j - 1] + 1;
否则
arr[i][j] = Math.max(arr[i][j - 1], arr[i - 1][j]);
3、考虑二维数组每次循环的时候只有最后一行数据才有作用,前面已经计算过的已无效,可以优化成一维数组。
4、考虑边界问题,可以在两个字符串前面追加“#”,防止边界越界,不要判断边界是否大于0,提升效率。
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int m = text1.length();
int n = text2.length();
m++;
n++;
int[] arr = new int[n];
char[] arr1 = ("#" + text1).toCharArray();
char[] arr2 = ("#" + text2).toCharArray();
int temp;
int now;
for (int i = 1; i < m; i++) {
temp = 0;
for (int j = 1; j < n; j++) {
now = arr[j];
if (arr1[i] == arr2[j]) {
arr[j] = temp + 1;
} else {
arr[j] = Math.max(arr[j - 1], arr[j]);
}
temp = now;
}
}
return arr[n - 1];
}
}
hongmingover
发布了111 篇原创文章 · 获赞 77 · 访问量 47万+
关注