代码随想录算法训练营第四十二天| 392.判断子序列 115.不同的子序列
392.判断子序列
要求:
判断第一个字符串是否是第二个字符串的子序列
思路1:
设置成deque,如果长度为0则是
代码1:
1 // 要求: 判断s 是否是t的子序列 2 // 思路: 将s作为queue,如果头相等,那么就弹出,遍历后,查看是否为0 3 // 4 bool isSubsequence_simple(string s, string t) { 5 deque<char> s_(s.begin(), s.end()); 6 7 for (int i = 0; i < t.size(); i++) 8 { 9 if (t[i] == s_.front()) 10 { 11 s_.pop_front(); 12 } 13 } 14 15 return s_.empty(); 16 }
思路2:
求这两个的最长公共子序列,如果长度==第一个字符串长度,则是
代码2:
1 bool isSubsequence(string s, string t) { 2 vector<vector<int>>dp(s.size() + 1, vector<int>(t.size() + 1, 0)); 3 int result = 0; 4 5 for (int i = 1; i <= s.size(); i++) 6 { 7 for (int j = 1; j <= t.size(); j++) 8 { 9 if (s[i - 1] == t[j - 1]) 10 dp[i][j] = dp[i - 1][j - 1] + 1; 11 else 12 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]); 13 14 result = result > dp[i][j] ? result : dp[i][j]; 15 } 16 } 17 18 return result == s.size(); 19 }
115.不同的子序列
要求:
在一个字符串中,找到另一个字符串作为子序列出现的次数
思路
dp[n][m] n-1的字符串内,以m-1出现的次数
所以如果相等的话,可以直接在原有的基础上加过来,但是因为可以不考虑当前的i,所以之前也有相等的情况,所以需要加上旁边的
dp[n][m-1]
代码:
1 // 要求:在s中t作为子序列出现的次数 2 // dp[n][m] : 以 n-1 为结尾,m-1作为子序列出现的个数 3 // 先对第一个字母进行初始化 4 // dp[i][j] = dp[i-1][j-1]+dp[i-1][j] 5 // else dp[i-1][j] 6 // 7 // 8 int numDistinct(string s, string t) { 9 vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1, 0)); 10 11 for (int i = 0; i <= s.size(); i++) dp[i][0] = 1; 12 13 for (int i = 1; i <= s.size(); i++) 14 { 15 for (int j = 1; j <= t.size(); j++) 16 { 17 if (s[i - 1] == t[j - 1]) 18 { 19 dp[i][j] = dp[i - 1][j] + dp[i-1][j - 1]; 20 } 21 else 22 { 23 dp[i][j] = dp[i - 1][j]; 24 } 25 } 26 } 27 28 return dp[s.size()][t.size()]; 29 }