def find_longest_common_substring(x: str, y: str) -> str:
    """
    Finds the longest common substring between the given two strings in a
    bottom-up way.
    :param x: str
    :param y: str
    :return: str
    """
    # Check whether the input strings are None or empty
    if not x or not y:
        return ''

    m, n = len(x), len(y)
    # Initialization
    subproblems = [[0] * (n + 1) for i in range(m + 1)]
    # Bottom-up calculation
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            x_curr, y_curr = x[i - 1], y[j - 1]
            if x_curr == y_curr:
                subproblems[i][j] = subproblems[i - 1][j - 1] + 1

    # Find the maximum of the longest common suffix of possible prefixes, which
    # is exactly the longest common substring
    i_max, max_length = 0, subproblems[0][0]
    for i in range(m + 1):
        for j in range(n + 1):
            if subproblems[i][j] > max_length:
                i_max = i
                max_length = subproblems[i][j]
    return x[i_max - max_length:i_max]
    # Overall running time complexity: O(mn)