现有一种使用字母的全新语言,这门语言的字母顺序与英语顺序不同。假设,您并不知道其中字母之间的先后顺序。但是,会收到词典中获得一个 不为空的 单词列表。因为是从词典中获得的,所以该单词列表内的单词已经 按这门新语言的字母顺序进行排序。您需要根据这个输入的列表,还原出此语言中已知的字母顺序。
例如:
输入:
[ "wrt", "wrf", "er", "ett", "rftt" ]
输出:
正确的顺序是:“wertf”
解题:意思是按照单词的顺序排序了。比如wrt和wrf,wrt排在wrf前面,说明优先级t>f,依次类推则有:
t->f
w->e
r->t
e->r
最终则有顺序:wertf
比较麻烦的就是如何转换成字符间的顺序格式,之后用拓扑排序就好了。
class Solution: def alienOrder(self,words): #chars用于获取字母集合 chars=set(''.join(words)) print(chars) #用于存储入度 degrees={x:0 for x in chars} from collections import defaultdict #用于存储优先级 graph=defaultdict(list) #pair是从上到下两两匹对 for pair in zip(words,words[1:]): print(pair) #x,y依次取出匹对的字母 for x,y in zip(*pair): print(x,y) if x!=y: #建立优先级关系 graph[x].append(y) #入度增加1 degrees[y]+=1 break print(degrees) print(graph) queue=[] for i in chars: if degrees[i] == 0: queue.append(i) res="" while queue: x=queue.pop(0) res+=x for i in graph[x]: degrees[i]-=1 if degrees[i]==0: queue.append(i) return res*(set(res)==chars) s=Solution() print(s.alienOrder([ "wrt", "wrf", "er", "ett", "rftt" ]))
结果:
第二种方法:使用深度优先遍历
class Solution: def alienOrder(self,words): #chars用于获取字母集合 chars=set(''.join(words)) print(chars) #用于存储入度 degrees={x:0 for x in chars} from collections import defaultdict #用于存储优先级 graph=defaultdict(list) #pair是从上到下两两匹对 for pair in zip(words,words[1:]): print(pair) #x,y依次取出匹对的字母 for x,y in zip(*pair): print(x,y) if x!=y: #建立优先级关系 graph[x].append(y) #入度增加1 degrees[y]+=1 break print(degrees) print(graph) lis=[] for i in chars: if degrees[i] == 0: lis.append(i) res="" while lis: tmp=[] for ch in lis: res+=ch for c in graph[ch]: degrees[c]-=1 if degrees[c]==0: tmp.append(c) del graph[ch] lis=tmp return res if len(res)==len(chars) else "" s=Solution() print(s.alienOrder([ "wrt", "wrf", "er", "ett", "rftt" ]))
参考:https://www.jianshu.com/p/ee280c838f2d