-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
243 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,25 @@ | ||
1143.最长公共子序列 | ||
第九章 动态规划part14 | ||
● 1143.最长公共子序列 | ||
● 1035.不相交的线 | ||
● 53. 最大子序和 动态规划 | ||
|
||
详细布置 | ||
|
||
1143.最长公共子序列 | ||
|
||
体会一下本题和 718. 最长重复子数组 的区别 | ||
视频讲解:https://www.bilibili.com/video/BV1ye4y1L7CQ | ||
https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html | ||
|
||
1035.不相交的线 | ||
|
||
其实本题和 1143.最长公共子序列 是一模一样的,大家尝试自己做一做。 | ||
视频讲解:https://www.bilibili.com/video/BV1h84y1x7MP | ||
https://programmercarl.com/1035.%E4%B8%8D%E7%9B%B8%E4%BA%A4%E7%9A%84%E7%BA%BF.html | ||
|
||
53. 最大子序和 | ||
|
||
这道题我们用贪心做过,这次 再用dp来做一遍 | ||
视频讲解:https://www.bilibili.com/video/BV19V4y1F7b5 | ||
https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C%EF%BC%88%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%EF%BC%89.html | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# 第九章 动态规划part15 | ||
|
||
|
||
详细布置 | ||
|
||
## 392.判断子序列 | ||
|
||
这道题目算是 编辑距离问题 的入门题目(毕竟这里只是涉及到减法),慢慢的,后面就要来解决真正的 编辑距离问题了 | ||
|
||
https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html | ||
|
||
## 115.不同的子序列 | ||
|
||
但相对于刚讲过 392.判断子序列,本题 就有难度了 ,感受一下本题和 392.判断子序列 的区别。 | ||
|
||
https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# 115.不同的子序列 | ||
|
||
扇贝力扣 | ||
|
||
最后一个测试案例答案是-1 | ||
|
||
递推公式想不清楚啊 啊嗷嗷啊 | ||
|
||
```cpp | ||
class Solution { | ||
public: | ||
int numDistinct(string s, string t) { | ||
// dp[i][j] = s[0:i-1]的子序列中t[0:j-1]出现的次数 | ||
vector<vector<unsigned long long>>dp(s.size()+1,vector<unsigned long long>(t.size()+1,0)); | ||
dp[0][0]=1; | ||
// for(int i=1;i<t.size()+1;i++)dp[0][i]=1; | ||
for(int j=1;j<s.size()+1;j++)dp[j][0]=1; | ||
// dp[i][j]+=dp[i][j-1] | ||
// if(s[i-1]==t[j-1])dp[i][j]+=dp[i-1][j-1] | ||
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]+dp[i-1][j-1]; | ||
else | ||
dp[i][j]=dp[i-1][j]; | ||
} | ||
return int(dp[s.size()][t.size()]); | ||
} | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# 392.判断子序列 | ||
|
||
抄了随想录 | ||
|
||
```cpp | ||
class Solution { | ||
public: | ||
bool isSubsequence(string s, string t) { | ||
// dp[i][j] 表示以下标i-1为结尾的字符串s, | ||
// 和以下标j-1为结尾的字符串t, | ||
// 相同子序列的长度为dp[i][j] | ||
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=i;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]; | ||
} | ||
} | ||
return dp[s.size()][t.size()]==s.size(); | ||
} | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# 583. 两个字符串的删除操作 | ||
|
||
自己做的喜喜 | ||
|
||
```cpp | ||
class Solution { | ||
public: | ||
int minDistance(string s, string t) { | ||
// dp[i][j]:s[0:i-1] vs t[0:j-1] | ||
// 想要达到相等,所需要删除元素的最少次数 | ||
vector<vector<int>>dp(s.size()+1,vector<int>(t.size()+1,0)); | ||
for(int j=1;j<t.size()+1;j++)dp[0][j]=j; | ||
for(int j=1;j<s.size()+1;j++)dp[j][0]=j; | ||
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]; | ||
}else{ | ||
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1; | ||
} | ||
} | ||
return dp[s.size()][t.size()]; | ||
} | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# 第九章 动态规划part16 | ||
|
||
|
||
详细布置 | ||
|
||
## 583. 两个字符串的删除操作 | ||
|
||
本题和动态规划:115.不同的子序列 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 | ||
https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html | ||
|
||
## 72. 编辑距离 | ||
|
||
最终我们迎来了编辑距离这道题目,之前安排题目都是为了 编辑距离做铺垫。 | ||
|
||
https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html | ||
|
||
## 编辑距离总结篇 | ||
做一个总结吧 | ||
https://programmercarl.com/%E4%B8%BA%E4%BA%86%E7%BB%9D%E6%9D%80%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB%EF%BC%8C%E5%8D%A1%E5%B0%94%E5%81%9A%E4%BA%86%E4%B8%89%E6%AD%A5%E9%93%BA%E5%9E%AB.html |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# 516.最长回文子序列 | ||
|
||
```cpp | ||
class Solution { | ||
public: | ||
int longestPalindromeSubseq(string s) { | ||
// dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j] | ||
vector<vector<int>>dp(s.size(),vector<int>(s.size(),0)); | ||
for (int i = 0; i < s.size(); i++) dp[i][i] = 1; | ||
for (int i = s.size() - 1; i >= 0; i--) { | ||
for (int j = i + 1; j < s.size(); j++) { | ||
if (s[i] == s[j]) { | ||
dp[i][j] = dp[i + 1][j - 1] + 2; | ||
} else { | ||
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); | ||
} | ||
} | ||
} | ||
return dp[0][s.size() - 1]; | ||
} | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# 647. 回文子串 | ||
|
||
抄了随想录 | ||
|
||
```cpp | ||
class Solution { | ||
public: | ||
int countSubstrings(string s) { | ||
// 布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。 | ||
vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false)); | ||
int result = 0; | ||
for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序 | ||
for (int j = i; j < s.size(); j++) { | ||
if (s[i] == s[j]) { | ||
if (j - i <= 1) { // 情况一 和 情况二 | ||
result++; | ||
dp[i][j] = true; | ||
} else if (dp[i + 1][j - 1]) { // 情况三 | ||
result++; | ||
dp[i][j] = true; | ||
} | ||
} | ||
} | ||
} | ||
return result; | ||
} | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# 72. 编辑距离 | ||
|
||
```cpp | ||
class Solution { | ||
public: | ||
int minDistance(string s, string t) { | ||
// s[0:i-1] vs t[0:j-1] 最近编辑距离为dp[i][j] | ||
vector<vector<int>>dp(s.size()+1,vector<int>(t.size()+1,0)); | ||
for(int j=1;j<t.size()+1;j++)dp[0][j]=j; | ||
for(int j=1;j<s.size()+1;j++)dp[j][0]=j; | ||
|
||
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]; | ||
} else { | ||
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1; | ||
} | ||
} | ||
return dp[s.size()][t.size()]; | ||
} | ||
}; | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# 第九章 动态规划part17 | ||
● 647. 回文子串 | ||
● 516.最长回文子序列 | ||
● 动态规划总结篇 | ||
|
||
今天 我们就要结束动态规划章节了,大家激不激动!!! | ||
|
||
详细布置 | ||
|
||
## 647. 回文子串 | ||
|
||
动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。 | ||
https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html | ||
|
||
## 516.最长回文子序列 | ||
647. 回文子串,求的是回文子串,而本题要求的是回文子序列, 大家要搞清楚两者之间的区别。 | ||
https://programmercarl.com/0516.%E6%9C%80%E9%95%BF%E5%9B%9E%E6%96%87%E5%AD%90%E5%BA%8F%E5%88%97.html | ||
|
||
## 动态规划总结篇 | ||
https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E6%80%BB%E7%BB%93%E7%AF%87.html | ||
|