def is_interleaving(first, second, target):
    m, n = len(first), len(second)
    if m + n != len(target):
        return False
    dp = [[False] * (n + 1) for _ in range(m + 1)]
    dp[0][0] = True
    for i in range(m + 1):
        for j in range(n + 1):
            if i:
                dp[i][j] |= dp[i - 1][j] and first[i - 1] == target[i + j - 1]
            if j:
                dp[i][j] |= dp[i][j - 1] and second[j - 1] == target[i + j - 1]
    return dp[m][n]
