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.
Recurse:
Judge Small: Accepted!
Judge Large: Time Limit Exceeded
bool isInterleave(string s1, string s2, string s3) { // Start typing your C/C++ solution below // DO NOT write int main() function if(s1.length() == 0) return s3 == s2; if(s2.length() == 0) return s3 == s1; if(s3.length() == 0) return s1.length() + s2.length() == 0; if(s1[0] == s3[0] && s2[0] != s3[0]) return isInterleave(s1.substr(1), s2, s3.substr(1)); else if(s1[0] != s3[0] && s2[0] == s3[0]) return isInterleave(s1, s2.substr(1), s3.substr(1)); else if(s1[0] == s3[0] && s1[0] == s3[0]) return isInterleave(s1.substr(1), s2, s3.substr(1)) || isInterleave(s1, s2.substr(1), s3.substr(1)); else return false; }
2-dimension dp:
这是一个二维的动态规划,
s1 = "aabcc"
s2 = "dbbca"
s3 = "aadbbcbcac"
class Solution { public: bool dp[101][101]; bool isInterleave(string s1, string s2, string s3) { // Start typing your C/C++ solution below // DO NOT write int main() function int size1 = s1.length(); int size2 = s2.length(); int size3 = s3.length(); if( size1 + size2 != size3) return false; memset(dp, false, sizeof(bool)*101*101); dp[0][0] = true; for(int i = 1; i <= size1; ++i) if(s1[i-1] == s3[i-1]) dp[i][0] = true; else break; for(int j = 1; j <= size2; ++j) if(s2[j-1] == s3[j-1]) dp[0][j] = true; else break; int k; for(int i = 1; i <= size1; ++i) for(int j = 1; j <= size2; ++j) { k = i + j; if(s1[i-1] == s3[k-1]) dp[i][j] = dp[i-1][j] || dp[i][j]; if(s2[j-1] == s3[k-1]) dp[i][j] = dp[i][j-1] || dp[i][j]; } return dp[size1][size2]; } };