我正在尝试解决CodeEval中的this问题。
在这个挑战中,我们建议你玩已知的游戏“Word 玩家提出以字母开头的单词 前一个单词以。结尾。挑战在于确定 可以从单词列表创建的链的最大长度。
示例:
Input:
soup,sugar,peas,rice
Ouput:
4
说明:我们可以形成一个包含4个字的链:“汤 - >豌豆 - >糖 - >米饭”。
约束:
我的尝试:我的方法是将单词建模为图形,这样输入中的每个单词代表一个节点,并且如果是最后一个字符,则在wordi到wordj之间存在(定向)边缘wordi的等同于wordj的第一个字符。
之后我从每个节点运行bfs并从该节点计算最远节点的长度。最终结果是所有节点可能达到的最大值。
但这种做法并没有给我一个满分。因此,我的问题是如何正确有效地解决这个问题?
答案 0 :(得分:0)
因为我的声誉不到50,所以我无法发表评论......
如果字的总数小于20,我们可以使用动态编程和位掩码来解决。 make dp [20] [1<< 20]。 dp [i] [j]表示你现在在i,你已经访问了bitmask j的单词。
如果数字大于20,我仍然没有好主意。可能是我们需要使用一些随机算法,也许......
我的想法是使用dfs并添加一些优化,因为35不是太大。我认为这足以解决问题。
答案 1 :(得分:0)
请参阅此处提到的解决方案:Detecting when matrix multiplication is possible
您的问题的解决方案几乎相同。创建有向图,以便为每个作品添加从第一个字母到最后一个字母的边。
然后在该图中找到欧拉路径(http://en.wikipedia.org/wiki/Euler_path)。
编辑:我发现您无法确保使用所有单词,并且您需要图表中最长的路径(http://en.wikipedia.org/wiki/Longest_path_problem)。这个问题是NP完全的。
答案 2 :(得分:0)
该页面提供了Core Java解决方案,它遵循以下过程:
使用Map / reduce hadoop框架还有另一种方法,word chain using map-reduce
中有详细介绍