题解 | #火星文字典# 拓扑排序

火星文字典

https://www.nowcoder.com/practice/29d1622d47514670a85e98a1f47b8e2d

lst = input().split()

# 入度表
in_degree = [-1 for i in range(26)]

# 遍历Word_list中的每一个字母
# 出现过的字母入度变为0, -1就代表字母没出现过
for word in lst:
    for i in range(len(word)):
        in_degree[ord(word[i])-97] = 0

import collections
graph = collections.defaultdict(list)

for i in range(len(lst)-1):
    cur = lst[i]
    next = lst[i+1]
    n = len(cur) if len(cur) < len(next) else len(next)
    for j in range(n):
		# 如果不一样,就创建一条cur -> next 的有向边
        if cur[j] != next[j]:
            in_degree[ord(next[j])-97] += 1
            graph[cur[j]].append(next[j])
            break

queue = collections.deque()

kind = 0  # 一共有多少种字符
for i in range(26):
    if in_degree[i] != -1:
        kind += 1
    if in_degree[i] == 0:
        queue.appendleft(i)

# 在弹出的时候 任何一次有两个入度为0的点就判为模棱两可
if len(queue) > 1:
    print('invalid')
    import sys
    sys.exit()

ans = ''
while queue:
    if len(queue) > 1:
        print('invalid')
        import sys
        sys.exit()

    cur = queue.pop()
    ans += chr(cur+97)
    for i in graph[chr(cur+97)]:
        in_degree[ord(i)-97] -= 1
        if in_degree[ord(i)-97] == 0:
            queue.appendleft(ord(i)-97)
            

print(ans if len(ans) == kind else 'invalid')

全部评论

相关推荐

豆泥🍀:同26届,加油,我也还没找到查看图片
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
03-29 08:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务