[LeetCode]97. Interleaving String
题目描述
思路
动态规划
以给出的样例为例
s1 = “aabcc”
s2 = “dbbca”
s3 = “aadbbcbcac”
dp | 0 | 1 a | 2 a | 3 b | 4 c | 5 c |
---|---|---|---|---|---|---|
0 | 1 | 1 | 1 | 0 | 0 | 0 |
1 d | 0 | 0 | 1 | 1 | 0 | 0 |
2 b | 0 | 0 | 1 | 1 | 1 | 0 |
3 b | 0 | 0 | 1 | 0 | 1 | 1 |
4 c | 0 | 0 | 1 | 0 | 1 | 0 |
5 a | 0 | 0 | 1 | 0 | 1 | 1 |
dp数组的状态与他的前面的状态有关,前面的状态表示为上述表格中当前位置的左方或者上方,当前一位置为1时,表示到当前位置是满足的,可以生成当前的字符串,在下一位置时,就需要比较s3的对应位置是否和s1或者s2的对应位置相等
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
if (s1.size() + s2.size() != s3.size())
return false;
vector<vector<int>> dp(s2.size() + 1, vector<int>(s1.size() + 1));
for (int i = 0; i < s2.size() + 1; ++i) {
for (int j = 0; j < s1.size() + 1; ++j) {
if (i == 0 && j == 0)
dp[i][j] = 1;
else if (i == 0 && j)
dp[i][j] = dp[i][j - 1] && s1[j - 1] == s3[i + j - 1];
else if (i && j == 0)
dp[i][j] = dp[i - 1][j] && s2[i - 1] == s3[i + j - 1];
else
dp[i][j] = (dp[i][j - 1] && s1[j - 1] == s3[i + j - 1]) || (dp[i - 1][j] && s2[i - 1] == s3[i + j - 1]);
}
}
return dp[s2.size()][s1.size()];
}
};
int main() {
Solution s;
cout << s.isInterleave("aabcc", "dbbca", "aadbbbaccc") << endl;
system("pause");
return 0;
}