【问题标题】:Best approach to solve Word Chain解决字链的最佳方法
【发布时间】:2014-09-28 20:43:17
【问题描述】:

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

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

例子:

Input:

soup,sugar,peas,rice

Ouput:
4

解释:我们可以形成这样的4个单词链:“soup->peas->sugar->rice”。

约束:

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

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

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

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

【问题讨论】:

  • 我他建了一棵树,不应该有一个循环。对于每个节点,您都知道子节点的剩余候选者列表。
  • @SteveK 嗯,sos 单独是一个循环,所以长度可以是无限的
  • @Pham - 如果您以sos 开始树,则剩余候选人列表将为{}。很难从一个空列表中产生一个循环。
  • @Pham 我同意(错过)解释的空间很小。但如果你是对的,那么约束对算法本身的影响几乎为零。所以我会说你错了,因为我认为约束是有原因的。无论如何,这有点毫无意义,特别是因为我们失去了 OP... :)
  • @jangroth 哈哈,完全同意:)

标签: java python c++ algorithm


【解决方案1】:

因为我的声望不到 50,所以我无法发表评论...

如果字的总数小于20,我们可以使用动态规划和位掩码来解决。 使 dp[20][1

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

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

【讨论】:

    【解决方案2】:

    查看这里提到的解决方案:Detecting when matrix multiplication is possible

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

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

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

    【讨论】:

      【解决方案3】:

      word chain in core java提到的解决方案

      页面在Core Java中给出了一个解决方案,它遵循以下过程:

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

      还有一种使用Map/reduce hadoop框架的方法,在word chain using map-reduce中有详细提到

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2011-04-12
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 2015-10-28
        • 2016-11-08
        • 2020-04-12
        • 1970-01-01
        相关资源
        最近更新 更多