问题描述
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
题目意思就是给定三个字符串s1,s2和s3,判断s3能否由s1,s2交叉组成。
思路分析
用一个动态规划的方法,顶一个二维的bool类型的数组dp,dp[i][j]表示s3的前i+j个字符能否由s1的前i个字符和s2的前j个字符交叉组成。
首先对于dp[i][0],只需判断s1和s3,先进行赋值;同理为dp[0][j]赋值。
之后对于每一个dp[i][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]);
c++代码
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int len1, len2, len3;
len1 = s1.length();
len2 = s2.length();
len3 = s3.length();
if(len1 + len2 != len3) return false;
vector<vector<bool>> dp(len1+1, vector<bool>(len2+1, true));
for(int i=1; i<=len1; i++){
dp[i][0] = (s1[i-1] == s3[i-1]) && dp[i-1][0];
}
for(int i=1; i<=len2; i++){
dp[0][i] = (s2[i-1] == s3[i-1]) && dp[0][i-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];
}
};