*269. Alien Dictionary
solution
from heapq import *
class Solution:
def alienOrder(self, words):
# construct graph
in_degree = {char: 0 for word in words for char in word}
neighbors = collections.defaultdict(list)
for pos in range(len(words) - 1):
for i in range(min(len(words[pos]), len(words[pos+1]))):
pre, next = words[pos][i], words[pos+1][i]
if pre != next: # 前后两个单词第一个不一样的字母
in_degree[next] += 1
neighbors[pre].append(next)
break
# topological sort
heap = [ch for ch in in_degree if in_degree[ch] == 0]
heapify(heap)
order = []
while heap:
for _ in range(len(heap)):
ch = heappop(heap)
order.append(ch)
for child in neighbors[ch]:
in_degree[child] -= 1
if in_degree[child] == 0:
heappush(heap, child)
# order is invalid
if len(order) != len(in_degree):
return ""
return ''.join(order)follow up
Last updated