1143.最长公共子序列
体会一下本题和 718. 最长重复子数组 的区别
视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>>dp(text1.size()+1,vector<int>(text2.size()+1,0));
int res=0;
for (int i=1;i<text1.size()+1;i++){
for (int j=1;j<text2.size()+1;j++){
if (text1[i-1]==text2[j-1])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
res=max(res,dp[i][j]);
}
}
return res;
}
};
1035.不相交的线
其实本题和 1143.最长公共子序列 是一模一样的,大家尝试自己做一做。
视频讲解:动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线_哔哩哔哩_bilibili
class Solution {
public:
int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>>dp(nums1.size()+1,vector<int>(nums2.size()+1,0));
int res=0;
for (int i=1;i<nums1.size()+1;i++){
for (int j=1;j<nums2.size()+1;j++){
if (nums1[i-1]==nums2[j-1])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
res=max(dp[i][j],res);
}
}
return res;
}
};
53. 最大子序和
这道题我们用贪心做过,这次 再用dp来做一遍
视频讲解:看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和_哔哩哔哩_bilibili
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int>dp(nums.size(),0);//表示以nums[i]结尾的最大值
dp[0]=nums[0];
int res=nums[0];
for (int i=1;i<nums.size();i++){
dp[i]=max(dp[i-1]+nums[i],nums[i]);
res=max(res,dp[i]);
}
return res;
}
};
392.判断子序列
这道题目算是 编辑距离问题 的入门题目(毕竟这里只是涉及到减法),慢慢的,后面就要来解决真正的 编辑距离问题了
class Solution {
public:
bool isSubsequence(string s, string t) {
int j=0;
for (int i=0;i<t.size();i++){
if (j<s.size() && s[j]==t[i]){
j++;
}
}
if (j>=s.size())return true;
return false;
}
};
class Solution {
public:
bool isSubsequence(string s, string t) {
vector<vector<int>>dp(s.size()+1,vector<int>(t.size()+1,0));
for (int i=1;i<s.size()+1;i++){
for (int j=1;j<t.size()+1;j++){
if (s[i-1]==t[j-1])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=dp[i][j-1];
}
}
if (dp[s.size()][t.size()]==s.size())return true;
return false;
}
};