当前位置:网站首页>力扣题解 动态规划(7)
力扣题解 动态规划(7)
2022-07-27 05:20:00 【RL-UAV】
115.不同的子序列
遍历顺序 从上到下 从左到右。
uint8_t,uint16_t,uint32_t等都不是什么新的数据类型,它们只是使用typedef给类型起的别名。
错误 for (int j = 1; j < t.size(); j++) dp0 = 0;
j = 1,开始 定义第一行第一列 已经上面这行代码初始化为 1了。剩下的为0.
class Solution {
public:
int numDistinct(string s, string t) {
vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
for (int i = 0; i < s.size(); i++) dp[i][0] = 1;
for (int j = 1; j < t.size(); j++) dp[0][j] = 0;
for (int i = 1; i <= s.size(); i++) {
for (int j = 1; j <= t.size(); j++) {
if (s[i - 1] == t[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[s.size()][t.size()];
}
};
583. 两个字符串的删除操作
总结:解法一
dp i :以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。
一定要区分 相等和不相等的时候
错误: 最后的for 循环的时候 要小于等于 ,第二个,如果min三个比较的话要加大括号。
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));
for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); j++) {
if (word1[i - 1] == word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = min({
dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});
}
}
}
return dp[word1.size()][word2.size()];
}
};
解法二:
本题和动态规划:1143.最长公共子序列 (opens new window)基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。
代码如下:
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1, 0));
for (int i=1; i<=word1.size(); i++){
for (int j=1; j<=word2.size(); j++){
if (word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
return word1.size()+word2.size()-dp[word1.size()][word2.size()]*2;
}
};
72. 编辑距离
总结:
dpi 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dpi。
那么dpi就应该是i,对word1里的元素全部做删除操作,即:dpi = i;
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;
for (int i = 1; i <= word1.size(); i++) {
for (int j = 1; j <= word2.size(); j++) {
if (word1[i - 1] == word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
}
else {
dp[i][j] = min({
dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;
}
}
}
return dp[word1.size()][word2.size()];
}
};
647. 回文子串
class Solution {
public:
int countSubstrings(string s) {
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] && (j - i <= 1 || dp[i + 1][j - 1])) {
result++;
dp[i][j] = true;
}
}
}
return result;
}
};
- 时间复杂度:O(n^2)
- 空间复杂度:O(n^2)
另解:双指针
class Solution {
public:
int countSubstrings(string s) {
int result = 0;
for (int i = 0; i < s.size(); i++) {
result += extend(s, i, i, s.size()); // 以i为中心
result += extend(s, i, i + 1, s.size()); // 以i和i+1为中心
}
return result;
}
int extend(const string& s, int i, int j, int n) {
int res = 0;
while (i >= 0 && j < n && s[i] == s[j]) {
i--;
j++;
res++;
}
return res;
}
};
516.最长回文子序列
总结:第一次斜对角的相等已经加1 了 单个肯定是回文,所以第二个循环从 j = i + 1;第二个开始判断。
class Solution {
public:
int longestPalindromeSubseq(string s) {
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];
}
};
边栏推荐
- Day 3. Suicidal ideation and behavior in institutions of higher learning: A latent class analysis
- C语言-自定义结构类型
- 力扣题解 动态规划(3)
- 解决conda install 安装停止、中断问题
- 根据SQL必知必会学习SQL(MYSQL)
- Baiwen driving Daquan learning (II) I2C driving
- 11. Gradient derivation of perceptron
- 编程学习记录——第4课【分支和循环语句】
- 安全帽反光衣检测识别数据集和yolov5模型
- 维度问题以及等高线
猜你喜欢

2021-06-26

【头歌】重生之机器学习-线性回归

18. Convolutional neural network

What tools are needed to make video post effects?

Redis在windows下的idea连接不上问题

韦东山 数码相框 项目学习(四)简易的TXT文档显示器(电纸书)
![[MVC Architecture] MVC model](/img/71/e10da490d5f0098c64b33e77d158e7.png)
[MVC Architecture] MVC model

超强远程连接管理工具:Royal TSX

pytorch使用data_prefetcher提升数据读取速度

Auto Encoder(AE),Denoising Auto Encoder(DAE), Variational Auto Encoder(VAE) 区别
随机推荐
When multiple formulas in latex share a sequence number
能替代ps的修图软件?
维度问题以及等高线
11. Gradient derivation of perceptron
operator() 用法之一
数据库索引的一些说明以及使用
编程学习记录——第9课【操作符】
代码随想录笔记_哈希_242有效的字母异位词
Redis在windows下的idea连接不上问题
2021-06-26
制作视频特效必备工具:NUKE 13
Weidongshan digital photo frame project learning (I) display ASCII characters on LCD
编程学习记录--第2课【初识C语言】
socket编程二:使用select
Day 3. Suicidal ideation and behavior in institutions of higher learning: A latent class analysis
cycleGAN解析
Gbase 8C - SQL reference 6 SQL syntax (12)
如何管理大量的定时任务
解决conda install 安装停止、中断问题
关于pytorch转onnx经常出现的问题