- 又是最长公共子序列题目的变体
- 两个字符串,如果长度小的字符串的长度值与最长公共子序列值一样,就说明是子序列成立
- 可以看成是长的字符串不掉删除字符,最后可以得到长度小的的字符串(顺序不能变)
- 动规五部曲
dp[i][j]
表示以i - 1
为结尾的字符串s
,和以j - 1
为结尾的字符串t
相同子序列的长度
class Solution {
public:
bool isSubsequence(std::string s, std::string t) {
int len1 = s.size(), len2 = t.size();
if (len1 > len2) {
return false;
}
std::vector<std::vector<int>> dp(len1 + 1, std::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] = dp[i][j - 1];
}
}
}
return dp[len1][len2] == len1;
}
};
- 这道题不需要判断第14行的
dp[i - 1][j]
,这涉及到字符串s
不需要删剪的情况(字符串t
需要删剪来变成s
)
- 汇总