题目

图片.png
图片.png

题解

dp[i][j]保存的是在长字符串t中 i 位置后 j+’a’ 出现的位置 ;
如果 t[i] = j+’a’ : 那就是说明t的i位置上的字符就是j+’a’ , 那么 dp[i][j] = i ;
否则的话就是 dp[i][j] = dp[i + 1][j]; 意思是t的i+1 后面出现的 j 就是 t的 i 后面出现的 j 。

  1. class Solution {
  2. public:
  3. bool isSubsequence(string s, string t) {
  4. int tl = t.size();
  5. int sl = s.size();
  6. vector<vector<int>> dp(tl + 1, vector<int>(26, 0));
  7. //设置从最后开始,最后的数以后出现的位置都为tl
  8. for (int i = 0 ; i < 26; i++) {
  9. dp[tl][i] = tl;
  10. }
  11. //从后往前进行规划填表
  12. for (int i = tl - 1; i >= 0; i--) {
  13. for (int j = 0; j < 26; j++) {
  14. if (t[i] == j + 'a') {
  15. dp[i][j] = i;
  16. }
  17. else {
  18. dp[i][j] = dp[i + 1][j];
  19. }
  20. }
  21. }
  22. int add = 0;
  23. //进行查表从前往后,如果为tl说明该字符在t中没有(开始在最后就设置了)
  24. for (int i = 0; i < sl; i++) {
  25. if (dp[add][s[i] - 'a'] == tl) {
  26. return false;
  27. }
  28. //有的话就从该位置进行
  29. add = dp[add][s[i] - 'a']+1;
  30. }
  31. return true;
  32. }
  33. };