原題鏈結
現有一種使用字母的全新語言,這門語言的字母順序與英語順序不同。
假設,您並不知道其中字母之間的先後順序。但是,會收到詞典中獲得乙個 不為空的 單詞列表。因為是從詞典中獲得的,所以該單詞列表內的單詞已經 按這門新語言的字母順序進行了排序。
您需要根據這個輸入的列表,還原出此語言中已知的字母順序。
示例 1:
輸入:[
「wrt」,
「wrf」,
「er」,
「ett」,
「rftt」
]輸出: 「wertf」
示例 2:
輸入:[
「z」,
「x」]
輸出: 「zx」
示例 3:
輸入:[
「z」,
「x」,
「z」]
輸出: 「」
解釋: 此順序是非法的,因此返回 「」。
注意:你可以預設輸入的全部都是小寫字母
假如,a 的字母排列順序優先於 b,那麼在給定的詞典當中 a 定先出現在 b 前面
若給定的順序是不合法的,則返回空字串即可
若存在多種可能的合法字母順序,請返回其中任意一種順序即可
# 火星字典
class
solution
:def
alienorder
(self,words)
: dic = self.build_dict(words)
graph = self.build_adj(words,dic)
path =
visited =[0
for _ in
range
(len
(dic))]
for i in
range
(len
(dic)):
ifnot visited[j]
: state = self.dfs(i,graph,path,visited)
ifnot state:
return
"" path.reverse(
) temp =
ans =
"".join(
[temp[i]
for i in path]
)return ans
defdfs(self,start,adj,path,visited)
: visited[start]=1
for next_node in adj[start]
:if visited[next_node]==1
:return
false
if visited[next_node]==2
:continue
state = self.dfs(next_node,adj,path,visited)
ifnot state:
return
false
visited[start]=2
return
true
defbuild_dict
(self,words)
: dic =
index =
0for word in words:
for char in word:
if char not
in dic:
dic[char]
= index
index +=
1return dic
defbuild_adj
(self,words,dic)
: graph =
for i in
range
(len
(dic)):
graph[i]=[
]for index,word in
enumerate
(words)
:if index<
len(words)-1
: i =
0while i<
len(words[index]
)and i <
len(words[index+1]
)and words[index]
[i]== words[index+1]
[i]:
i +=
1if i <
len(words[index]
)and i <
len(words[index+1]
):graph[dic[words[index]
[i]]]1
][i]])
return graph
leetcode 詞典中最長的單詞
考慮基於單詞查詢樹 trie 結構解決該問題 由於所有的輸入字串中只包含小寫字母,因此我們可以使用 向單詞查詢樹結構,其中r 26.基於單詞查詢樹,我們可以使用深度優先搜尋方法搜尋所有由其他單詞逐步新增乙個字母所構成的單詞,並返回長度最長的字串 相同長度下,返回字典序最小的字串 在單詞查詢樹中如何搜...
Leetcode 953 驗證外星語詞典
某種外星語也使用英文小寫字母,但可能順序order不同。字母表的順序 order 是一些小寫字母的排列。給定一組用外星語書寫的單詞words,以及其字母表的順序order,只有當給定的單詞在這種外星語中按字典序排列時,返回true 否則,返回false。示例 1 輸入 words hello lee...
LeetCode 953 驗證外星語詞典
某種外星語也使用英文小寫字母,但可能順序 order 不同。字母表的順序 order 是一些小寫字母的排列。給定一組用外星語書寫的單詞 words,以及其字母表的順序 order,只有當給定的單詞在這種外星語中按字典序排列時,返回 true 否則,返回 false。示例 1 輸入 words hel...