剑指 Offer II 115. 重建序列

exiaohu 于 2022-07-23 发布

题目链接:剑指 Offer II 115. 重建序列

拓扑排序,每个数字是图中的一个节点。

记录每个节点的入节点和出节点,如果在拓扑排序选择的每一步都只能选择一个元素,那给定序列就是所有子序列的最短唯一超序列。

from collections import defaultdict, deque
from typing import List


class Solution:
    def sequenceReconstruction(self, nums: List[int], sequences: List[List[int]]) -> bool:
        prevs, succs = defaultdict(set), defaultdict(set)

        for sequence in sequences:
            for i in range(1, len(sequence)):
                prevs[sequence[i]].add(sequence[i - 1])
                succs[sequence[i - 1]].add(sequence[i])

        starts = deque(num for num in nums if len(prevs[num]) == 0)
        while starts:
            if len(starts) > 1:
                return False

            for num in succs[starts[0]]:
                prevs[num].discard(starts[0])
                if not prevs[num]:
                    starts.append(num)
            starts.popleft()

        return True