繁体   English   中英

解决Word Chain的最佳方法

[英]Best approach to solve Word Chain

我试图在CodeEval中解决这个问题。

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

例:

Input:

soup,sugar,peas,rice

Ouput:
4

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

约束:

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

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

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

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

因为我的声誉不到50,所以我不能发表评论......

如果word的总数小于20,我们可以使用动态编程和位掩码来解决。 make dp [20] [1 << 20]。 dp [i] [j]表示你现在在i,你访问了bitmask j的单词。

对于数字大于20,我仍然没有一个好主意。 也许我们需要使用一些随机算法,也许....

我的想法是使用dfs并添加一些优化,因为35不是太大。 我认为这足以解决问题。

请参阅此处提到的解决方案: 检测何时可以进行矩阵乘法

解决问题的方法几乎相同。 创建有向图,以便为每个工作添加从第一个字母到最后一个字母的边。

然后在该图中找到Euler路径( http://en.wikipedia.org/wiki/Euler_path )。

编辑:我看到你不能保证使用所有单词,你需要图中最长的路径( http://en.wikipedia.org/wiki/Longest_path_problem )。 这个问题是NP完全的。

请参阅核心java中提到的字链的解决方案

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

  1. 将字典项加载到内存中以获得给定的字长
  2. 从内存中获取给定单词的下一个符合条件的单词列表

还有另一种使用Map / reduce hadoop框架的方法, 使用map-reduce单词链中详细提到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM