classSolution { public: boolisSubsequence(string s, string t){ int index = 0; for(int i = 0; i < s.size(); ++ i){ if(find(t.begin() + index, t.end(), s[i]) != t.end()){ index = find(t.begin() + index, t.end(), s[i]) - t.begin() + 1; }else{ returnfalse; } } returntrue; } };
官方题解1 - 双指针
类似于我的想法,用一个指针指当前位置,另一个指针去找下个字母的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { public: boolisSubsequence(string s, string t){ int n = s.length(), m = t.length(); int i = 0, j = 0; while (i < n && j < m) { if (s[i] == t[j]) { i++; } j++; } return i == n; } };
官方题解2 - 动态规划
令 f[i][j] 表示字符串 t 中从位置 i 开始往后字符 j 第一次出现的位置。在进行状态转移时,如果 t 中位置 i 的字符就是 j,那么 f[i][j]= i ,否则 j 出现在位置 i+1 开始往后,即 f[i][j]=f[i+1][j],因此我们要倒过来进行动态规划,从后往前枚举 i。