leetcode做题笔记97. 交错字符串

给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。

两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

  • s = s1 + s2 + ... + sn
  • t = t1 + t2 + ... + tm
  • |n - m| <= 1
  • 交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

注意:a + b 意味着字符串 a 和 b 连接。

思路一:动态规划

bool isInterleave(char *s1, char *s2, char *s3)
{
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int len3 = strlen(s3);

    int **f = (int**)malloc(sizeof(int*) * (len1 + 1));
    for (int i = 0; i < len1 + 1; i++) {
        f[i] = (int*)malloc(sizeof(int) * (len2 + 1));
        memset(f[i], 0, sizeof(int) * (len2 + 1));
    }
    if (len1 + len2 != len3) {
        return false;
    }
    f[0][0] = true;
    for (int i = 0; i <= len1; i++) {
        for (int j = 0; j <= len2; j++) {
            int p = i + j - 1;
            if (i > 0) {
                f[i][j] |= (f[i - 1][j] && s1[i - 1] == s3[p]);
            }
            if (j > 0) {
                f[i][j] |= (f[i][j - 1] && s2[j - 1] == s3[p]);
            }
        }
    }
    int ans = f[len1][len2];
    for (int i = 0; i < len1 + 1; i++) {
        free(f[i]);
        f[i] = NULL;
    }
    free(f);
    f = NULL;
    return ans;
}

分析:

本题可使用动态规划方法解答,理解状态方程f[i][j] |= (f[i - 1][j] && s1[i - 1] == s3[p]);,即不断向后查找相同字符串,并使用f数组记录,最后返回ans即可

总结:

本题考察动态规划的应用,对于字符串内字符判断是否有两个字符串中字符,最后返回ans

你可能感兴趣的:(动态规划,leetcode,笔记,算法)