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()]
动归方程:
代码
根据方程写出代码:
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];
}
};