拓扑排序,每个数字是图中的一个节点。
记录每个节点的入节点和出节点,如果在拓扑排序选择的每一步都只能选择一个元素,那给定序列就是所有子序列的最短唯一超序列。
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