代码随想录算法训练营第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()];
	}
};
相关推荐
tryxr1 小时前
矩阵的几种基础变换
java·数据结构·算法·矩阵
mmmmath_31 小时前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
Selvaggia1 小时前
DMD(Distribution Matching Distillation,分布匹配蒸馏)
算法
Navigator_Z2 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
All for pursuit.2 小时前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
All for pursuit.2 小时前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
wzdark2 小时前
数据压缩算法的时间复杂度与压缩率权衡4
算法
小陈phd2 小时前
深入理解agent学习笔记(一)——现代agent介绍
人工智能·算法
渡我白衣2 小时前
HttpRequest与HttpResponse的实现
服务器·数据结构·c++·人工智能·tcp/ip·机器学习·caffe
晴天的雨.9925 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法