在最长的单词链问题中 -
从给定的单词集中创建一个最长的单词链,以便后续单词链 单词从前一个单词的最后一个字符开始。
我对与以下问题匹配的算法感到困惑,尝试了Levenshtein距离,但它不是问题所需要的。任何帮助将不胜感激建议算法或任何链接,以提供更多信息。
答案 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