def METHOD_NAME(ordered_ops: List[Op],
                   pattern: List[str]) -> Optional[List[MhaInfo]]:
    """
    Determine if the ordered ops contain the given pattern or not using sliding window approach.
    :param ordered_ops: Orderered connected graph ops.
    :param pattern: A pattern is list of connected graph op types in order of occurence.
    :return: List of MHAInfo which consists of mha's type and qualified name.
    """
    mha_modules_info = []
    sliding_window = deque(maxlen=len(pattern))
    for index, op in enumerate(ordered_ops):
        sliding_window.append(op)
        sliced_pattern = [op.type for op in sliding_window]
        if sliced_pattern == pattern:
            _, parent_name = ordered_ops[index].dotted_name.split(".", 1)
            module_qualified_name, _ = parent_name.rsplit(".", 1)
            mha_info = MhaInfo(type(ordered_ops[index].residing_module),
                               module_qualified_name)
            mha_modules_info.append(mha_info)
    return mha_modules_info