解决Word Chain的最佳方法

时间:2014-08-06 02:49:52

标签: java python c++ algorithm

我正在尝试解决CodeEval中的this问题。

  

在这个挑战中,我们建议你玩已知的游戏“Word   玩家提出以字母开头的单词   前一个单词以。结尾。挑战在于确定   可以从单词列表创建的链的最大长度。

示例:

Input:

soup,sugar,peas,rice

Ouput:
4

说明:我们可以形成一个包含4个字的链:“汤 - >豌豆 - >糖 - >米饭”。

约束:

  • 单词列表的长度在[4,35]范围内。
  • 单词列表中的单词由随机小写的ascii字符串表示,长度为[3,7]个字母。
  • 单词列表中没有重复的单词。

我的尝试:我的方法是将单词建模为图形,这样输入中的每个单词代表一个节点,并且如果是最后一个字符,则在wordi到wordj之间存在(定向)边缘wordi的等同于wordj的第一个字符。

之后我从每个节点运行bfs并从该节点计算最远节点的长度。最终结果是所有节点可能达到的最大值。

但这种做法并没有给我一个满分。因此,我的问题是如何正确有效地解决这个问题?

3 个答案:

答案 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)

请参阅提及word chain in core java

的解决方案

该页面提供了Core Java解决方案,它遵循以下过程:

  1. 将字典项加载到内存中以获得给定的字长
  2. 从内存中获取下一个符合条件的单词列表
  3. 使用Map / reduce hadoop框架还有另一种方法,word chain using map-reduce

    中有详细介绍