lintcode892 外星人词典 拓扑排序+堆排序

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值