1035.不相交的线(中等)
思路:和最长公共子序列一样
class Solution {
public int maxUncrossedLines(int[] nums1, int[] nums2) {
int n = nums1.length;
int m = nums2.length;
int dp[][] = new int[n+1][m+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(nums1[i-1]==nums2[j-1])dp[i][j] = dp[i-1][j-1]+1;
dp[i][j] = Math.max(dp[i][j],Math.max(dp[i-1][j],dp[i][j-1]));
}
}
return dp[n][m];
}
}
53. 最大子序和(中等)
class Solution {
public int maxSubArray(int[] nums) {
int max = nums[0];
for(int i=1;i<nums.length;i++){
nums[i] = Math.max(nums[i-1]+nums[i],nums[i]);
if(nums[i]>max)max = nums[i];
}
return max;
}
}
392.判断子序列(简单)
class Solution {
public boolean isSubsequence(String s, String t) {
if(s.length()==0)return true;
int it = 0;
for(char c:t.toCharArray()){
if(it==s.length())return true;
if(c==s.charAt(it))it++;
}
return it==s.length();
}
}
115.不同的子序列(困难)
思路:
s[ i ] != t[ j ] 时,说明当前 i 和 j 匹配不上,此时统计dp[i][j],只能取 i-1 与 j 匹配的结果,因为当前不匹配
s[ i ] == t [ j ]时,有两种状态,首先如果i-1和j-1 有子集匹配结果,加上i 和 j 下标的元素相等的情况下,dp[i][j]会继承dp[i-1][j-1]
还有一种情况,j 已经与 i-1 成功匹配,不需要 i 就可以匹配,这部分也需要继承
class Solution {
public int numDistinct(String s, String t) {
int n = s.length();
int m = t.length();
int dp[][] = new int[n+1][m+1];
for(int i=0;i<=n;i++)dp[i][0] = 1;
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
if(s.charAt(i-1)==t.charAt(j-1))dp[i][j] = dp[i-1][j-1]+dp[i-1][j];
else dp[i][j] =dp[i-1][j];
}
}
return dp[n][m];
}
}