文章目录
- 1. 最长公共子序列(1143)
- 2. 不相交的线(1035)
1. 最长公共子序列(1143)
题目描述:
状态表示:
建立一个二维的数组dp,dp[i][j]表示在第一个字符串的0到i区间以及第二个字符串的0到j区间中的公共子序列的最长长度。
状态转移方程:
分为两种情况,第一种情况就是当第一个字符串的i位置和第二个字符串的j位置元素相同时,那么dp[i][j]=dp[i-1][j-1]+1。第二种情况当当第一个字符串的i位置和第二个字符串的j位置元素不相同时,那么dp[i][j]=max(dp[i-1][j],dp[i][j-1])。
初始化:
初始化因为要避免越界问题所以二维数组dp建立时的尺寸为m+1*n+1。对于dp数组中的值要处理两个维度都是从1下标开始的。
填表顺序:
从上到下,从左至右。
返回值:
返回值就是dp[m][n]。
代码如下:
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int m = text1.length();
int n = text2.length();
int[][] dp = new int[m + 1][n + 1];
String s1 = " " + text1;
String s2 = " " + text2;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (s1.charAt(i) == s2.charAt(j)) {
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[m][n];
}
}
题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)
2. 不相交的线(1035)
题目描述:
状态表示:
跟上题类似,不过这一题是两个数组,dp[i][j]表示第一个数组0到i区间内与第二个数组0到j的区间内的公共数字串,可以这样理解。
状态转移方程:
状态转移方程和上一题也是类似,当i和j位置元素相等的时候,dp[i][j]=dp[i-1][j-1]+1,当不相等时,那么dp[i][j]=max(dp[i-1][j],dp[i][j-1])。
初始化:
初始化和上题一致。
填表顺序:
和上题一致。
返回值:
和上题一致都是dp[m][n]。
代码如下:
class Solution {
public int maxUncrossedLines(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int[][] dp = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (nums1[i-1] == nums2[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[m][n];
}
}
题目链接
时间复杂度:O(N^2)
空间复杂度:O(N^2)