看到一句话:“When you see string problem that is about subsequence or matching, dynamic programming method should come to your mind naturally. ”
class Solution {
public:
bool dp[101][101];
bool isInterleave(string s1, string s2, string s3) {
int size1 = s1.length();
int size2 = s2.length();
int size3 = s3.length();
if (size1 + size2 != size3) return false;
memset(dp, false, sizeof(bool) * 101 * 101);//有意思的初始化方法
dp[0][0] = true;
//初始化列
for (int i = 1; i <= size1; ++i)
{
if (s1[i - 1] == s3[i - 1]) //s3的前几位一直和s1匹配
dp[i][0] = true;
else
break;
}
//初始化行
for (int j = 1; j <= size2; ++j)
{
if (s2[j - 1] == s3[j - 1])//s3的前几位一直和s2匹配
dp[0][j] = true;
else
break;
}
int k;
for (int i = 1; i <= size1; ++i)
{
for (int j = 1; j <= size2; ++j)
{
k = i + j;
if (s1[i - 1] == s3[k - 1]) dp[i][j] = dp[i - 1][j] || dp[i][j];
if (s2[j - 1] == s3[k - 1]) dp[i][j] = dp[i][j - 1] || dp[i][j];
}
}
return dp[size1][size2];
}
};