97. 交错字符串 Interleaving String

题目 <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;
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/112133735
今日推荐