字符串交错
串s1和串s2交错,能否形成s3。
bool isInterleave(string s1, string s2, string s3) {
// 设dp[i][j]表示s1[0..i)和s2[0..j)能否交错出s3[0..i+j)
// 1) 若s1[i-1]==s3[i+j-1],dp[i][j]=dp[i-1][j];
// 2) 若s2[j-1]==s3[i+j-1],dp[i][j]=dp[i][j-1];
// 两种情况有一种能交错就行,所以,
// dp[i][j] = (s1[i-1]==s3[i+j-1] && dp[i-1][j])
// || (s2[j-1]==s3[i+j-1] && dp[i][j-1])
// 初始dp[0][0]=true
const int M = s1.size(), N = s2.size();
if (s3.size() != M + N) return false;
vector<vector<bool>> dp(M + 1, vector<bool>(N + 1, false));
dp[0][0] = true;
for (int i = 0; i <= M; i++) {
for (int j = 0; j <= N; j++) {
if (i > 0) {
dp[i][j] = dp[i][j] || ((s1[i-1] == s3[i+j-1]) && dp[i-1][j]);
}
if (j > 0) {
dp[i][j] = dp[i][j] || ((s2[j-1] == s3[i+j-1]) && dp[i][j-1]);
}
}
}
return dp[M][N];
}