找到数组中包含其他单词的最长单词

时间:2015-05-04 10:12:50

标签: arrays algorithm find

我有一个单词数组,需要找到数组中最长的单词,该单词由此数组中的其他单词组成。例如:

  String[] mass = {
            "five",
            "fivetwo",
            "fourfive",
            "fourfivetwo",
            "one",
            "onefiveone",
            "two",
            "twofivefourone"
        };

结果应该是" fourfivetwo" - > " fourfive" " 2&#34 ;.你能帮我找一下算法吗?

2 个答案:

答案 0 :(得分:1)

存在使用字符串匹配算法KMP和图表的解决方案。

<强>算法:

1)迭代单词。将每个单词设置为&#34;主要单词&#34;,即要构建的单词。对每个这样的单词执行以下步骤。

2)你固定了一个单词,我们称之为W.现在再次遍历所有单词并运行KPM将它们与W进行比较。现在你可以在单词W上建立一个图形。让我们解释一下例子:

W = "abacdeeee"
Other_word = ["aba", "cde", "eee"]

Word "aba" would connect letter 1 in word W to letter 4.
Word "cde" would connect 4 to 7.
Word "eee" would connect 7 to 9.

Each letter in W is node and other words will make edges. 
If there exists a path between first and last letter, which you can 
check using BFS/DFS, you can build word W out of other words.

3)对每个单词重复此过程,并选择可以从其他单词构建的最长单词。

时间复杂度:

假设N是单词数,L是平均长度。

对于单个单词,您将使用每个其他单词运行KMP,这将采用O(N *(L + L))。在最坏的情况下,构建图需要O(N ^ 2),对于BFS也是如此。对于每个字W,你花费O(N L + N ^ 2)最坏的情况,但是边数很可能与N成比例,所以平均值是O(N L)。

如果您需要对每个N进行上述操作,您将获得结果:

最差复杂度:O(N ^ 2 * L + N ^ 3)

平均复杂度:O(N ^ 2 * L)

答案 1 :(得分:0)

谢谢大家,我已经决定,如果有人对这里的代码感兴趣。我为此感到羞耻,但它有效。

{{1}}

}