Python程序:检测输入单词中是否存在短路
假设我们有一列单词。我们必须检查给定的单词是否可以连接成一个环。只有当单词A的最后一个字符与单词B的第一个字符相同,单词A才能放在单词B的前面。每个单词都必须使用,并且只能使用一次(首尾单词不算)。
因此,如果输入类似于words = ["ant","dog","tamarind","nausea","gun"],则输出为True。
为了解决这个问题,我们将遵循以下步骤:
graph := 一个新的键值对列表
seen := 一个新的集合
inDegree := 一个新的键值对列表
outDegree := 一个新的键值对列表
对于words中的每个单词,执行:
start := word[0]
end := word[-1]
将end插入graph[start]的末尾
outDegree[start] := outDegree[start] + 1
inDegree[end] := inDegree[end] + 1
对于outDegree中的每个节点,执行:
如果outDegree[node]与inDegree[node]不同,则
返回False
dfs(words[0,0])
如果seen的大小与graph的大小相同,则返回seen的大小
定义一个函数dfs()。这将接受一个节点。
将node添加到seen中
对于graph[node]中的每个子节点,执行:
如果seen中不存在子节点,则
dfs(子节点)
示例
让我们看下面的实现以更好地理解:
import collections class Solution: def solve(self, words): self.graph = collections.defaultdict(list) self.seen = set() inDegree = collections.Counter() outDegree = collections.Counter() for word in words: start = word[0] end = word[-1] self.graph[start].append(end) outDegree[start] += 1 inDegree[end] += 1 for node in outDegree: if outDegree[node] != inDegree[node]: return False self.dfs(words[0][0]) return len(self.seen) == len(self.graph) def dfs(self, node): self.seen.add(node) for child in self.graph[node]: if child not in self.seen: self.dfs(child) ob = Solution() print(ob.solve(["ant","dog","tamarind","nausea","gun"]))
输入
["ant","dog","tamarind","nausea","gun"]
输出
True
广告