算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 火星词典,我们先来看题面:
https://leetcode-cn.com/problems/alien-dictionary/
There is a new alien language which uses the latin alphabet. However, the order among letters are unknown to you. You receive a list of non-empty words from the dictionary, where words are sorted lexicographically by the rules of this new language. Derive the order of letters in this language.
现有一种使用字母的全新语言,这门语言的字母顺序与英语顺序不同 。
假设,您并不知道其中字母之间的先后顺序。但是,会收到词典中获得一个 不为空的 单词列表。因为是从词典中获得的,所以该单词列表内的单词已经 按这门新语言的字母顺序进行了排序 。
您需要根据这个输入的列表,还原出此语言中已知的字母顺序。
示例 1:
输入:
[
"wrt",
"wrf",
"er",
"ett",
"rftt"
]
输出: "wertf"
示例 2:
输入:
[
"z",
"x"
]
输出: "zx"
示例 3:
输入:
[
"z",
"x",
"z"
]
输出: ""
解释: 此顺序是非法的,因此返回 ""。
https://blog.csdn.net/qq_28468707/article/details/103586977
class Solution(object):
def alienOrder(self, words):
"""
:type words: List[str]
:rtype: str
"""
# 1.构建图
hashMap = {}
for i in range(len(words)-1):
for j in range(min(len(words[i]), len(words[i+1]))):
# 如果字符相同,比较下一个
if words[i][j] == words[i+1][j]:
continue
# 保存第一个不同的字符顺序,位于前面的字母作为key,位于后面的字母存到set中作为值
else:
s=hashMap.get(words[i][j],set())
s.add(words[i+1][j])
hashMap[words[i][j]] = s
break
degrees = [-1 for _ in range(26)]
# 将出现过的字符的出度设定为0,为了统计所有出现的不同的字母的个数
# 没有出现的字母出度为-1,出现了的字母的出度为非负数
for word in words:
for c in word:
degrees[ord(c)-ord("a")] = 0
for key,value in hashMap.items():
for val in value:
# 出现了的字母的入度+1
degrees[ord(val)-ord("a")] += 1
# 创建一个Queue保存入度为0的节点
Q = []
total = 0
for i in range(26):
if degrees[i] != -1:
total+=1
if degrees[i] == 0:
Q.append(chr(i+ord("a")))
res = ""
while Q:
t = Q.pop(0)
res+=t
# 图中的最后一个字母,在本例中例如f是不在hashmap中的
if t in hashMap:
for c in hashMap[t]:
# 将邻接点入度-1
degrees[ord(c)-ord("a")] -= 1
if degrees[ord(c)-ord("a")] == 0:
Q.append(c)
# 判断是否有环
if len(res) != total:
return ""
else:
return res
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。