LeetCode97—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.
分析
动态规划,dp[i][j]表示前i个字符的s1子串和前
现在讨论dp[i][j]的递推关系:
1. 当s3的第i+j−1个字符来自于s1,即s3[i+j−1]==s1[i−1],那么当dp[i−1][j]为true时,dp[i][j]也一定为true。
2. 同理,当s3的第i+j−1个字符来自于s2,即s3[i+j−1]==s2[j−1],那么当dp[i][j−1]为true时,dp[i][j]也一定为true
3. 最后返回值为dp[s1.size()][s2.size()]
动归方程:
dp[i][j]={dp[i−1][j]dp[i][j−1]if s3[i+j−1]==s1[i−1],dp[i−1][j] is trueif s3[i+j−1]==s2[j−1],dp[i][j−1] is true
代码
根据方程写出代码:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int len1 = s1.size();
int len2 = s2.size();
int len3 = s3.size();
if ((len1 + len2) != len3)
return false;
if (len1 == 0 && len1 == len2&&len2 == len3)
return true;
vector<vector<bool>>dp(len1 + 1, vector<bool>(len2 + 1));
dp[0][0] = true;
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++)
{
if ((s1[i - 1] == s3[i + j - 1])&&(dp[i-1][j]))
{
dp[i][j] = dp[i - 1][j];
}
if ((s2[j - 1] == s3[i + j - 1])&&(dp[i][j-1]) )
{
dp[i][j] = dp[i][j - 1];
}
}
}
return dp[len1][len2];
}
};