1. Given strings s1, s2, and s3, find whether s3 is formed by an interleaving of s1 and s2.
  2. An interleaving of two strings s and t is a configuration where they are divided into non-empty substrings such that:
  3. s = s1 + s2 + ... + sn
  4. t = t1 + t2 + ... + tm
  5. |n - m| <= 1
  6. The interleaving is s1 + t1 + s2 + t2 + s3 + t3 + ... or t1 + s1 + t2 + s2 + t3 + s3 + ...
  7. Note: a + b is the concatenation of strings a and b.
  8. Example 1:
  9. Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
  10. Output: true
  11. Example 2:
  12. Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
  13. Output: false
  14. Example 3:
  15. Input: s1 = "", s2 = "", s3 = ""
  16. Output: true
  17. Constraints:
  18. 0 <= s1.length, s2.length <= 100
  19. 0 <= s3.length <= 200
  20. s1, s2, and s3 consist of lowercase English letters.
  21. Follow up: Could you solve it using only O(s2.length) additional memory space?

这题没有那么简单,我是没想出来要用dp来做,看了别人的思路后写了份dp的实现。

这题首先我们需要找递推公式。递推的依据是s1中放入n个,s2中放入m个,能否符合题意。

然后我们开始递推下一个元素。假设是当s1中放入了n+1个元素,s2中放入m个,能否符合题意。这种情况下,假设此次操作放入的是s1,那么s1对应位置的字符,肯定需要等于s3串中(n+1+m-1)索引处的值,不然肯定不符合题意;同时,假设相等了,那么dp[i-1][j]也必须符合条件才行,假设之前的就不符合题意了,那么我再加一个元素肯定也不符合题意。

同样的,在n+1,m这个选择上,我们还可以选择本身s1就有n+1个元素,s2选取一个元素放入。

最后,我们最后一个值就可判断放入s1长度的元素和s2长度的元素,是否能满足题意。

  1. class InterleavingString : public Solution {
  2. public:
  3. void Exec() {
  4. }
  5. bool isInterleave(string s1, string s2, string s3) {
  6. if (s1.size() + s2.size() != s3.size()) return false;
  7. vector<vector<bool>> dps(s1.size() + 1, vector<bool>(s2.size() + 1, false));
  8. dps[0][0] = true;
  9. for (int i = 0; i < s1.size(); i++) {
  10. if (s1[i] != s3[i]) {
  11. break;
  12. }
  13. dps[i + 1][0] = true;
  14. }
  15. for (int j = 0; j < s2.size(); j++) {
  16. if (s2[j] != s3[j]) {
  17. break;
  18. }
  19. dps[0][j + 1] = true;
  20. }
  21. for (int i = 1; i <= s1.size(); i++) {
  22. for (int j = 1; j <= s2.size(); j++) {
  23. dps[i][j] = (s1[i - 1] == s3[i + j - 1] && dps[i - 1][j]) ||
  24. (s2[j - 1] == s3[i + j - 1] && dps[i][j - 1]);
  25. }
  26. }
  27. return dps.back().back();
  28. }
  29. };
共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day