97. Interleaving String
Hard
72735FavoriteShare
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
Example 1:
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Output: true
Example 2:
Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Output: false
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;
vector<bool> dp(len2+1,false);
for(int i=0;i<=len1;++i)
for(int j=0;j<=len2;++j)
{
if(i==0 && j==0) dp[0] = true;
else if(i == 0) dp[j] = (s2[j-1]==s3[j-1]) && dp[j-1];
else if(j == 0) dp[0] = (s1[i-1] == s3[i-1]) && dp[0];
else dp[j] = (s1[i-1] == s3[i+j-1] && dp[j]) || (s2[j-1] == s3[i+j-1] && dp[j-1]);
}
return dp[len2];
}
};
这也是一道典型的动态规划,处理字符串的问题。
转移方程:
if(i==0 && j==0) dp[0] = true;
else if(i == 0) dp[j] = (s2[j-1]==s3[j-1]) && dp[j-1];
else if(j == 0) dp[0] = (s1[i-1] == s3[i-1]) && dp[0];
else dp[j] = (s1[i-1] == s3[i+j-1] && dp[j]) || (s2[j-1] == s3[i+j-1] && dp[j-1]);
空间优化跟之前一样;