Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 =
s2 =
When s3 =
When s3 =
Analysis:For example,
Given:
s1 =
"aabcc"
,s2 =
"dbbca"
,When s3 =
"aadbbcbcac"
, return true.When s3 =
"aadbbbaccc"
, return false.It reminds me of the Edit Distance problem. As we could break this problem down to some smaller problems, i.e., consider if s1[:i-1] and s2[:j-1] could build s[:i+j-1], we could use DP.
We could construct a matrix dp[s1.length()+1][s2.length()+1], remember in DP we usually leave one more extra space for initial condition, which is both s1 and s2 are blank string in this problem. Each entry dp[i][j] indicates whether s1[i-1] and s2[j-1] could build s[:i+j-1].
Now consider the transfer function. dp[i][j] is true if either of the following cases is true:
1) current char in s1 is same as current char in s3, and previous dp entry in the same row is true
i.e., s1[i-1]==s3[i+j-1] && dp[i-1][j]) == true
2) current char in s2 is same as current char in s3, and previous dp entry in the same col is true
i.e., s2[j-1]==s3[i+j-1] && dp[i][j-1] == true
Our final answer is in the last entry of the DP matrix.
The time complexity of the algorithm is O(len1 * len2), where the two lengths are the lengths of s1 and s2, respectively.
Code:
class Solution { public: bool isInterleave(string s1, string s2, string s3) { int len1=s1.length(), len2=s2.length(); if (len1+len2!=s3.length()) return false; vector<vector<bool>> dp(len1+1, vector<bool> (len2+1, false)); // initial dp[0][0]=true; for (int i=1; i<=len1; i++) if (s1[i-1]==s3[i-1] && dp[i-1][0]) dp[i][0]=true; for (int j=1; j<=len2; j++) if (s2[j-1]==s3[j-1] && dp[0][j-1]) dp[0][j]=true; // update dp for (int i=1; i<=len1; i++) { for (int j=1; j<=len2; j++) { dp[i][j]=(s1[i-1]==s3[i+j-1] && dp[i-1][j]) || (s2[j-1]==s3[i+j-1] && dp[i][j-1]); } } return dp[len1][len2]; } };
No comments:
Post a Comment