题目大意:给出三个字符串,问第三个可否由前两个字符串组成,要求在第三个字符串中的字符顺序较原字符串而言不能改变
分析:动规。递归超时,选择动规。两个字符串可以作为一个二维地图,我们需要做的就是判断能否从左上角走到右下角。
向右走就是s2的这位去匹配s3的当前位,向下走就是s1的这位匹配s3的当前位。
代码:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int m = s1.size();
int n = s2.size();
if((m + n) != s3.size()) return false;
vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));
dp[0][0] = true;
for(int j = 1;j <= n;j++){
if(s2[j - 1] == s3[j - 1])
dp[0][j] = true;
else break;
}
for(int i = 1;i <= m;i++){
if(s1[i - 1] == s3[i - 1])
dp[i][0] = true;
else break;
}
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
if(dp[i - 1][j] && s1[i - 1] == s3[i + j - 1] || dp[i][j - 1] && s2[j - 1] == s3[i + j - 1])
dp[i][j] = true;
}
}
return dp[m][n];
}
};