题目 <https://leetcode-cn.com/problems/interleaving-string/>
一开始的思路就是动态规划,只不过dp的范围定小了......
大师,我悟了
打印dp的时候,发现个问题
虽然题解说的是 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]
但是也会有 s1[i+j-1]==s3[i+j-1] || s2[i+j-1] == s3[i+j-1] 这两种情况??
bool isInterleave(char * s1, char * s2, char * s3){
int s1_len = strlen(s1);
int s2_len = strlen(s2);
int s3_len = strlen(s3);
if(s1_len+s2_len != s3_len){
return false;
}
bool **dp = malloc(sizeof(bool*) * (s1_len+1));
int i,j;
for(i=0;i<=s1_len;i++){
dp[i] = malloc(sizeof(bool) * (s2_len+1));
}
dp[0][0] = true;
for(i=1;i<=s1_len;i++){
dp[i][0] = (dp[i-1][0]&&s1[i-1]==s3[i-1]);
}
for(i=1;i<=s2_len;i++){
dp[0][i] = (dp[0][i-1]&&s2[i-1]==s3[i-1]);
}
for(i=1;i<=s1_len;i++){
for(j=1;j<=s2_len;j++){
//printf("%c %c %c\n",s1[i-1],s2[j-1],s3[i+j-1]);
if(s1[i-1] == s3[i+j-1] && s2[j-1] == s3[i+j-1]){
dp[i][j] = dp[i-1][j]||dp[i][j-1];
}else if(s1[i-1] == s3[i+j-1]){
dp[i][j] = dp[i-1][j];
}else if(s2[j-1] == s3[i+j-1]){
dp[i][j] = dp[i][j-1];
}else{
dp[i][j] = false;
}
}
}
/*
for(i=0;i<=s1_len;i++){
for(j=0;j<=s2_len;j++){
printf("%d, ",dp[i][j]);
}
printf("\n");
}
*/
bool flag = dp[s1_len][s2_len];
for(i=0;i<=s1_len;i++){
free(dp[i]);
}
free(dp);
return flag;
}