For example,
Given:
s1 =
s2 =
Given:
s1 =
"aabcc"
,s2 =
"dbbca"
,
When s3 =
When s3 =
"aadbbcbcac"
, return true.When s3 =
"aadbbbaccc"
, return false./*passed small test, but did not pass large test. It is slow due to the overlapping subproblems, and it run in exponential time. See below for the faster solution. */ class Solution { private: bool build(string const& a, string const& b, string const& c, int const aii, int const bii){//true-a, false-b if (aii < 0 && bii < 0) return true; if (aii < 0){ if (b[bii] != c[aii+bii+1]) return false; else return build(a,b,c,aii,bii-1); } if (bii < 0){ if (a[aii] != c[aii+bii+1]) return false; else return build(a,b,c,aii-1,bii); } if (b[bii] != c[aii+bii+1] && a[aii] != c[aii+bii+1]) return false; bool ra=false, rb=false; if (a[aii] == c[aii+bii+1]) ra= build(a,b,c,aii-1,bii); if (b[bii] == c[aii+bii+1]) rb= build(a,b,c,aii,bii-1); return ra||rb; } public: bool isInterleave(string s1, string s2, string s3) { // Start typing your C/C++ solution below // DO NOT write int main() function if (s1.length() + s2.length() != s3.length()) return false; if (s1.empty() || s2.empty()) return (!s1.compare(s3) || !s2.compare(s3)); return build(s1,s2,s3,s1.length()-1,s2.length()-1); } }; /**The one below works for both small and large cases */ class Solution { public: bool isInterleave(string s1, string s2, string s3) { // Start typing your C/C++ solution below // DO NOT write int main() function if (s1.length() + s2.length() != s3.length()) return false; if (s1.empty() || s2.empty()) return (!s1.compare(s3) || !s2.compare(s3)); s1 = "S"+s1; s2 = "S"+s2; s3 = "S"+s3;//index starts from 1 vector<vector<bool> > v(s1.length()+1, vector<bool>(s2.length()+1, false)); v[0][0]=true; for(int ii = 1; ii < s2.length(); ++ii){ if (s2[ii] == s3[ii]) v[0][ii] = v[0][ii-1]; } for(int ii = 1; ii < s1.length(); ++ii){ if (s1[ii] == s3[ii]) v[ii][0] = v[ii-1][0]; } for(int ii = 1; ii <s1.length(); ++ii){ for(int jj = 1; jj <s2.length(); ++jj){ if (s1[ii] == s3[ii+jj]) v[ii][jj] = v[ii][jj] || v[ii-1][jj]; if (s2[jj] == s3[ii+jj]) v[ii][jj] = v[ii][jj] || v[ii][jj-1]; } } return v[s1.length()-1][s2.length()-1]; } };
No comments:
Post a Comment