LeetCode:Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc"
,
s2 = "dbbca"
,
When s3 = "aadbbcbcac"
, return true.
When s3 = "aadbbbaccc"
, return false.
开始理解错了题意,以为s3可以包含多个s1或者s2。如果匹配的话,s3只包含一个s1和s2
递归解法:每次比较s1和s3的最后一个字符或者s2和s3的最后一个字符,如果相等去掉两者的最后一个字符进入子问题,只要一个子问题返回true,父问题就返回true
isInterleave(s1[0...n1], s2[0...n2], s3[0...n3]) = (s1[n1] == s3[n3] && isInterleave(s1[0...n1-1], s2[0...n2], s3[0...n3-1])) || (s2[n2] == s3[n3] && isInterleave(s1[0...n1], s2[0...n2-1], s3[0...n3-1]))
1 class Solution { 2 public: 3 bool isInterleave(string s1, string s2, string s3) { 4 // IMPORTANT: Please reset any member data you declared, as 5 // the same Solution instance will be reused for each test case. 6 return isInterleaveRecur(s1, s1.length()-1, s2, s2.length()-1, s3, s3.length()-1); 7 } 8 bool isInterleaveRecur(string &s1, int end1, string &s2, int end2, string &s3, int end3) 9 { 10 if(end1 == -1 && end2 == -1 ) 11 { 12 if(end3 == -1) 13 return true; 14 else return false; 15 } 16 if(end1 >=0 && s1[end1] == s3[end3] && isInterleaveRecur(s1, end1-1, s2, end2, s3, end3-1)) 17 return true; 18 if(end2 >=0 && s2[end2] == s3[end3] && isInterleaveRecur(s1, end1, s2, end2-1, s3, end3-1)) 19 return true; 20 return false; 21 } 22 };
动态规划解法:根据递归的思想,我们一刻如下使用动态规划解此题。设dp[i][j]表示s1[0...i-1]和s2[0...j-1]能否组合成s3[0....i+j-1],动态规划方程如下 本文地址
- dp[i][j] = (dp[i][j-1] ==true && s3[i+j-1] == s2[j-1]) || (dp[i-1][j] == true && s3[i-1+j] == s1[i-1])
- 初始条件:if(s1[0] == s3[0])dp[1][0] = true , if(s2[0] == s3[0])dp[0][1] = true; 其他值均为false
1 class Solution { 2 public: 3 bool isInterleave(string s1, string s2, string s3) { 4 // IMPORTANT: Please reset any member data you declared, as 5 // the same Solution instance will be reused for each test case. 6 const int len1 = s1.length(), len2 = s2.length(), len3 = s3.length(); 7 if(len1 == 0)return s2 == s3; 8 else if(len2 == 0)return s1 == s3; 9 // dp[i][j]表示s1[0...i-1]和s2[0...j-1]能否组合成s3[0....i+j-1] 10 bool dp[len1+1][len2+1]; 11 memset(dp, 0, sizeof(dp)); 12 if(len3 != 0) 13 { 14 if(s1[0] == s3[0])dp[1][0] = true; 15 if(s2[0] == s3[0])dp[0][1] = true; 16 } 17 else return false;// len3 = 0,但是len1和len2不等于0 18 if(len1 + len2 != len3)return false;//长度关系不满足 19 for(int i = 0; i <= len1; i++) 20 for(int j = 0; j <= len2; j++) 21 { 22 int tmp = i+j-1; 23 if(j > 0) 24 { 25 if(dp[i][j-1] && s3[tmp] == s2[j-1]) 26 {dp[i][j] = true; continue;} 27 } 28 if(i > 0) 29 { 30 if(dp[i-1][j] && s3[tmp] == s1[i-1]) 31 dp[i][j] = true; 32 } 33 } 34 if(dp[len1][len2])return true; 35 else return false; 36 } 37 };
【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3448469.html