97. 交错字符串
‘解析:二维dp
dp[i][j]代表s1前i个和s2前j个是否能组成s3的i+j个
状态转移方程就很简单了,
但这一题要求空间限制,可以观察到dp其实只记录一维就可以,因为用到了i-1或者j-1
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int n = s1.size(), m = s2.size(), k = s3.size();
if (n + m != k) return false;
else if (n == 0) return s2 == s3;
else if (m == 0) return s1 == s3;
int dp[105][105];
dp[0][0] = true;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (i == 0 && j == 0) continue;
if (i == 0) {
dp[i][j] = dp[i][j - 1] && (s2[j - 1] == s3[j - 1]);
} else if (j == 0) {
dp[i][j] = dp[i - 1][j] && (s1[i - 1] == s3[i - 1]);
} else {
int id = i + j - 1;
dp[i][j] = dp[i][j - 1] && (s2[j - 1] == s3[id]) || dp[i - 1][j] && (s1[i - 1] == s3[id]);
}
}
}
return dp[n][m];
}
};
class Solution { public: bool isInterleave(string s1, string s2, string s3) { int n = s1.size(), m = s2.size(), k = s3.size(); if (n + m != k) return false; else if (n == 0) return s2 == s3; else if (m == 0) return s1 == s3; int dp[105]; dp[0] = true; for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { if (i == 0 && j == 0) continue; if (i == 0) { dp[j] = dp[j - 1] && (s2[j - 1] == s3[j - 1]); } else if (j == 0) { dp[j] = dp[j] && (s1[i - 1] == s3[i - 1]); } else { int id = i + j - 1; dp[j] = dp[j - 1] && (s2[j - 1] == s3[id]) || dp[j] && (s1[i - 1] == s3[id]); } } } return dp[m]; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号