- 困难
- 中等
- 简单
题目描述
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。来源,leetcode 每日一题 97. 交错字符串
示例:
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false
输入:s1 = "", s2 = "", s3 = ""
输出:true
解题思路
- S3是有S1和S2组成,那么思路就可以如下:
- s3的前k个字符,可否由s1的前i个字符和s2的前j个字符交错而成?
- 使用动态规划:由于这里涉及到了s1和s2,那么就需要用二维数组,每个纬度分别表示s1或者s2,则动态转移方程为:
- result[i][j] = result[i-1][j] if s1[i] == s3[k] 或者
- result[i][j] = result[i][j-1] if s2[j] == s3[k]
代码
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if (s3.length() != s1.length() + s2.length()) {
return false;
} else if (s3.find(s1) != s3.npos && s3.find(s2) != s3.npos) {
return true;
}
int length1 = s1.length();
int length2 = s2.length();
vector<vector<bool>> result(s1.length() + 1,vector<bool>(s2.length() + 1));
result[0][0] = true;
for (int i = 0; i <= length1; i++) {
for (int j = 0; j <= length2; j++) {
int p = i + j - 1;
if (i > 0) {
result[i][j] = (result[i-1][j] && s1[i-1] == s3[p]) | result[i][j];
}
if (j > 0) {
result[i][j] = (result[i][j-1] && s2[j-1] == s3[p]) | result[i][j];
}
p++;
}
}
return result[length1][length2];
}
};
总结
什么时候会需要用动态规划?
当问题可以按顺序进行解决的时候!