代码随想录算法训练营第58天 | 392.判断子序列 115.不同的子序列

判断子序列

这道题可以双指针方法解决。

cpp 复制代码
class Solution {
public:
	bool isSubsequence(string s, string t) {
		int s_index = 0;
		for(int t_index = 0; t_index < t.size(); t_index++) {
			if(s[s_index] == t[t_index]) {
				s_index++;
			}
		}
		return s_index == s.size();
	}
};

用动态规划也是可解的,是简化的编辑距离问题。通过删除 t 中的字符得到 s,求解能否实现。dpij 表示 i-1 之前的字符串s子串和 j-1 之前的字符串t子串之间的最长公共子序列长度。这道题与上一道最长公共子序列是相同的。

cpp 复制代码
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(); i++) {
			for(int j = 1; j <= t.size(); j++) {
				if(s[i - 1] == t[j - 1]) {
					dp[i][j] = dp[i - 1][j - 1] + 1;
				}
				else {
					// 因为是判断s是不是t的子序列,所以只删除t中的字符就可以,从dp[i][j-1]继承数值
					dp[i][j] = dp[i][j - 1];  
				}
			}
		}
		return dp[s.size()][t.size()] == s.size();  // 最长公共子序列与s一样长,说明s就是t的子序列
	}
};

不同的子序列

这道题也是编辑距离类型的问题。本题中只涉及删除操作,对字符串 s 删除字符得到 t,求解操作方案的数目。

dpij 表示从字符串 s 下标 i-1 之前子串通过删除字符得到字符串 t 下标 j-1 之前子串的方案数目。

递推公式:针对这类问题我们可以发现,只需要考虑两种情况s[i - 1] == t[j - 1]s[i - 1] != t[j - 1]。对于第一种情况,可以用 si - 1 进行匹配,这部分的方法数目是 dpi - 1j - 1,也可以不用 si - 1 进行匹配,这部分的数目继承自 dpi - 1j;对于第二种情况,没法匹配上 si - 1 和 tj - 1,只能继承自 dpi - 1j

初始化:dp0j 意味着空数组转换成字符串 t,没有方案可以实现,初始化为0。dpi0 意味着字符串 s 转换成空数组,只有一种方案,初始化为1。dp00表示空数组到空数组,初始化为1。

cpp 复制代码
class Solution {
public:
	int numDistinct(string s, string t) {
		vector<vector<int>> dp(s.size() + 1, vector<int>(t.size() + 1, 0));
		int max_value = INT_MAX;
		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]) {
					if(dp[i - 1][j] < max_value - dp[i - 1][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()];
	}
};
相关推荐
中微极客16 小时前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek16 小时前
前缀和实现Kogge-Stone算法
数据结构·算法
元Y亨H16 小时前
开发者必须掌握的十大核心算法
算法
元Y亨H16 小时前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法
元Y亨H17 小时前
数据结构与算法的通俗指南
数据结构·算法
2301_7644413317 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
林泽毅17 小时前
PyTRIO快速入门(二):Datum构建
人工智能·算法·产品
keep intensify17 小时前
最长有效括号
算法·leetcode·动态规划
CoderYanger17 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
猫头虎18 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作