我有一个单词数组,需要找到数组中最长的单词,该单词由此数组中的其他单词组成。例如:
String[] mass = {
"five",
"fivetwo",
"fourfive",
"fourfivetwo",
"one",
"onefiveone",
"two",
"twofivefourone"
};
结果应该是" fourfivetwo" - > " fourfive" " 2&#34 ;.你能帮我找一下算法吗?
答案 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}}
}