Timeline Dynamic Programming Problem:
Let dp[i][j] \texttt{dp[i][j]}\\ dp[i][j] denote s1[0..=i-1] \texttt{s1[0..=i-1]} s1[0..=i-1] (where1 ≤ i ≤ s1.length() 1 \leq i \leq \texttt{s1.length()} 1 ≤ i ≤ s1.length() ) ands2[0..=j-1] \texttt{s2[0..=j-1]} s2[0..=j-1] (where1 ≤ j ≤ s2.length() 1 \leq j \leq \texttt{s2.length()} 1 ≤ j ≤ s2.length() ) can interleave to forms3[0..=i+j-1] \texttt{s3[0..=i+j-1]} s3[0..=i+j-1] 。d p [ 0 ] [ 0 ] dp[0][0] d p [ 0 ] [ 0 ] denotes1 \texttt{s1} s1 、s2 \texttt{s2} s2 ands3 \texttt{s3} s3 both take empty strings.
dp[0][0] = true \texttt{ dp[0][0] = true} \\ dp[0][0] = true
Consider only s1, i.e.s1[0..=i-1]whether it can be interleaved to forms3[0..i-1], obviously dp[i][0] = dp[i-1][0] && (s3[i - 1] == s1[i- 1]); \texttt{dp[i][0] = dp[i-1][0] \&\& (s3[i - 1] == s1[i- 1]);} \\ dp[i][0] = dp[i-1][0] && (s3[i - 1] == s1[i- 1]);
Similarly, considering only s2 gives: dp[0][j] = dp[0][j-1] && (s3[j - 1] == s2[j- 1]); \texttt{dp[0][j] = dp[0][j-1] \&\& (s3[j - 1] == s2[j- 1]);} \\ dp[0][j] = dp[0][j-1] && (s3[j - 1] == s2[j- 1]);
Considering both s1 and s2 gives: from_s1 = dp[i-1][j] && (s1[i-1] == s3[i+j-1]); \texttt{from\_s1 = dp[i-1][j] \&\& (s1[i-1] == s3[i+j-1]);} \\ from_s1 = dp[i-1][j] && (s1[i-1] == s3[i+j-1]);
from_s2 = dp[i][j-1] && (s2[j-1] == s3[i+j-1]); \texttt{from\_s2 = dp[i][j-1] \&\& (s2[j-1] == s3[i+j-1]);} \\ from_s2 = dp[i][j-1] && (s2[j-1] == s3[i+j-1]);
dp[i][j] = from_s1 || from_s2; \texttt{dp[i][j] = from\_s1 || from\_s2;} \\ dp[i][j] = from_s1 || from_s2;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <vector> #include <string> using std::string;using std::vector;class Solution { public : bool isInterleave (string s1, string s2, string s3) { int n1 = s1.l ength(), n2 = s2.l ength(), n3 = s3.l ength(); int i, j; bool from_s1, from_s2; if (n1 + n2 != n3) { return false ; } vector<vector<bool > > dp (n1 + 1 , vector <bool >(n2 + 1 , false )); dp[0 ][0 ] = true ; for (i = 1 ; i <= n1; i++) { dp[i][0 ] = dp[i - 1 ][0 ] && (s3[i - 1 ] == s1[i - 1 ]); } for (j = 1 ; j <= n2; j++) { dp[0 ][j] = dp[0 ][j - 1 ] && (s3[j - 1 ] == s2[j - 1 ]); } for (i = 1 ; i <= n1; i++) { for (j = 1 ; j <= n2; j++) { from_s1 = dp[i - 1 ][j] && (s1[i - 1 ] == s3[i + j - 1 ]); from_s2 = dp[i][j - 1 ] && (s2[j - 1 ] == s3[i + j - 1 ]); dp[i][j] = from_s1 || from_s2; } } return dp[n1][n2]; } };