1. 双指针
我之前的错误想法是:用两个循环嵌套。。,其实是两个字符串的指针一致移动
class Solution {
public:
bool isSubsequence(string s, string t) {
int i = 0, j = 0;
for(; i < s.size() && j < t.size(); j++)
{
if(s[i] == t[j])
{
i++;
}
}
return i == s.size();
}
};
2. 动态规划
1. dp数组的定义
下标:以 i - 1 和 j - 1 为结尾的字符串
值:以 i - 1 和 j - 1 为结尾的字符串的相同子序列长度
2. 递推公式
if(s[i - 1] == t[j - 1]) // 当前的字符都相同,就在之前的基础上 + 1
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
dp[i][j] = dp[i][j - 1]; // 不相同的话 , j 就向前移动一个,因为字符串t是一定更长的
3. 初始化
和之前一样初始化成 0 。可以参考 最长公共子序列
4. 遍历顺序
从上到下,从小到大
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
dp[i][j] = dp[i][j - 1];
}
}
return dp[s.size()][t.size()] == s.size();
}
};