892.外星人词典
注意事项第四点:
4.这里可能有多个有效的字母顺序,返回以正常字典顺序看来最小的。
–>用heap保证pop出q的一定是字典序最小的字母
topo排序的模板:
indegree[被入的node] += 1
adjacency[入的node].append(被入的node)
from heapq import *
class Solution:
"""
@param words: a list of words
@return: a string which is correct order
"""
def alienOrder(self, words):
# Write your code here
indegree,adjacency = self.get_indegree(words)
q = [n for n in indegree if indegree[n]==0]
heapify(q)
res = ''
while q:
pre = heappop(q)
res += pre
for cur in adjacency[pre]:
indegree[cur] -= 1
if not indegree[cur]:
heappush(q,cur)
if len(res) == len(indegree):
return res
return ''
def get_indegree(self,words):
indegree = {ch:0 for word in words for ch in word}
adjacency = {ch:[] for word in words for ch in word}
for i in range(1,len(words)):
a,b = words[i-1],words[i]
l = min(len(a),len(b))
for j in range(l):
if a[j] == b[j]:
continue
else:
indegree[b[j]] += 1#
adjacency[a[j]].append(b[j])
break
return indegree,adjacency