392.判断子序列
最长公共子序列
class Solution {
public:
bool isSubsequence(string s, string t) {
int len1 = s.length();
int len2 = t.length();
vector<vector<int>> dp(len1+1,vector<int>(len2+1,0));
for(int i=1;i<=len1;++i){
for(int j=1;j<=len2;++j){
if(s[i-1]==t[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 dp[len1][len2]==len1;
}
};
动态规划
- 确定dp数组以及下标含义。dp[i][j]表示长度为i的s是否是长度为j的t的子序列。
- 确定递推公式。if(s[i-1]==t[j-1]&&dp[i-1][j-1]) dp[i][j]=true;else dp[i][j] = dp[i][j-1];
- 数组初始化。dp[0][i] = true;
- 确定遍历顺序。从前往后遍历
- 举例推导dp数组
class Solution {
public:
bool isSubsequence(string s, string t) {
int len1 = s.length();
int len2 = t.length();
vector<vector<bool>> dp(len1+1,vector<bool>(len2+1,false));
for(int j=0;j<=len2;++j) dp[0][j] = true;
for(int i=1;i<=len1;++i){
for(int j=1;j<=len2;++j){
if(s[i-1]==t[j-1]&&dp[i-1][j-1]) dp[i][j] = true;
else dp[i][j]=dp[i][j-1] ;
}
}
return dp[len1][len2];
}
};
115.不同的子序列
- 确定dp数组以及下标含义.dp[i][j]表示长度为i的t在长度为j的s中出现的次数。
- 确定递推公式。if(t[i-1]==s[j-1]) dp[i][j] = dp[i-1][j-1](用t[i-1]匹配s[j-1]) + dp[i-1]j;
- 数组初始化。dp[0][j] = 0;
- 确定遍历顺序。从前往后遍历
- 举例推导dp数组
class Solution {
public:
int numDistinct(string s, string t) {
int len1 = t.length();
int len2 = s.length();
vector<vector<uint64_t>>dp(len1+1,vector<uint64_t>(len2+1,0));
for(int j=0;j<=len2;++j) dp[0][j]=1;
for(int i=1;i<=len1;++i){
for(int j=1;j<=len2;++j){
if(t[i-1]==s[j-1]) dp[i][j] = dp[i-1][j-1]+dp[i][j-1];
else dp[i][j] = dp[i][j-1];
}
}
return dp[len1][len2];
}
};
在C++中,uint64
和uint64_t
是等效的类型,它们都表示无符号的64位整数。它们的使用方式和功能都是相同的。
uint64
是一种常见的简化写法,通常在代码中使用。它是通过包含适当的头文件(如cstdint
或stdint.h
)来定义的。
uint64_t
是一个正式的类型,它在C++标准库的头文件cstdint
中定义。使用uint64_t
时,需要包含该头文件,并在变量声明中明确地使用uint64_t
作为类型。例如:
#include <cstdint>
uint64_t myNumber = 1234567890;
无论使用uint64
还是uint64_t
,都可以进行位运算、数值计算等操作,表示无符号的64位整数。