Python - 给定单词列表中最长的单词链序列

时间:2016-01-26 17:08:23

标签: python python-2.7 python-3.x

在最长的单词链问题中 -

  

从给定的单词集中创建一个最长的单词链,以便后续单词链   单词从前一个单词的最后一个字符开始。

我对与以下问题匹配的算法感到困惑,尝试了Levenshtein距离,但它不是问题所需要的。任何帮助将不胜感激建议算法或任何链接,以提供更多信息。

1 个答案:

答案 0 :(得分:1)

此问题映射到longest path problem,来自图论:每个单词都是图中的节点,如果第二个单词以第一个单词的最后一个字符开头,则两个节点之间有一个有向边。这个问题是NP难的。这意味着如果单词数量很少,您只能以最佳方式解决它。如果单词的数量很大,那么可以尝试不同的启发式方法,产生次优,但也许是足够好的结果。

如果字数小于20,并且每条边可能只有很少的边,则应该可以枚举所有可能的非循环路径。然后你只需要选择最长的一个。

def generate_all_paths(graph):
  paths = []
  for node in graph.nodes:
    paths.append(generate_all_paths_beginning_at_node(n,graph))
  return paths

def generate_all_paths_beginning_at_node(start_node,graph):
  paths = []
  reduced_graph = extract_node_from_graph(graph,start_node)
  for next_node in graph.get_nodes_that_have_an_edge_from(start_node)
    sub_paths = generate_all_paths_beginning_at_node(next_node,reduced_graph)
    paths.append([[start_node] + p for p in sub_paths]) # Add start_node to all paths generated from the reduced_graph.
  if paths==[]: # No edge coming out of start_node
    paths = [[start_node]] # The only solution is a path of length 0 (one node).
return paths