题目: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交叉组合而成的。利用动态规划求解,令dp[i][j]表示s3的前i+j个字符是否由s1的前i个字符和s2的前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])。代码实现如下:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int len1 = s1.size(), len2 = s2.size(), len3 = s3.size();
vector<vector<bool> > dp(len1+1, vector<bool>(len2+1, false));
if (len1+len2 != len3) return false;
//init
dp[0][0] = 1;
for (int i = 1; i <= len1; i++) {
if (s1[i-1] == s3[i-1]) dp[i][0] = dp[i-1][0];
}
for (int j = 1; j <= len2; j++) {
if (s2[j-1] == s3[j-1]) dp[0][j] = dp[0][j-1];
}
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];
}
};