这听起来像是一个算法设计问题,因为它可以通过蛮力来实现,但也必须有一个很好的分而治之的解决方案。
正如@justinvf 所说,您必须首先定义最小长度才能获得任何有意义的结果,否则您最重复的短语几乎肯定会是e
,因为这是最常出现的字符(无论如何都是英语)。
蛮力方法是计算最小长度 $m$ 的所有短语,方法是使用子字符串str[0:m]...[0+1:m+1]...
一直到段落末尾,同时计算任何重复。然后将增量增加到 2 并重复。似乎时间复杂度类似于 $\mathcal{O} (n^{nm})$ 其中 $n$ 是段落中的字符数。
T̶h̶e̶ ̶d̶i̶v̶i̶d̶e̶ ̶a̶n̶d̶ ̶c̶o̶n̶q̶u̶e̶r̶ ̶a̶p̶p̶r̶o̶a̶c̶h̶ ̶w̶o̶u̶l̶d̶ ̶b̶e̶ ̶t̶o̶ ̶r̶e̶c̶u̶r̶s̶i̶v̶e̶l̶y̶ ̶f̶o̶l̶l̶o̶w̶ ̶t̶h̶e̶s̶e̶ ̶s̶t̶e̶p̶s̶:̶ ̶ ̶1̶.̶ ̶C̶a̶l̶c̶u̶l̶a̶t̶e̶ ̶t̶h̶e̶ ̶p̶h̶r̶a̶s̶e̶-̶f̶r̶e̶q̶u̶e̶n̶c̶e̶ ̶i̶n̶ ̶t̶h̶e̶ ̶L̶H̶S̶ ̶o̶f̶ ̶t̶h̶e̶ ̶s̶t̶r̶i̶n̶g̶ ̶2̶.̶ ̶C̶a̶l̶c̶u̶l̶a̶t̶e̶ ̶t̶h̶e̶ ̶p̶h̶r̶a̶s̶e̶-̶f̶r̶e̶q̶u̶e̶n̶c̶e̶ ̶i̶n̶ ̶t̶h̶e̶ ̶R̶H̶S̶ ̶o̶f̶ ̶t̶h̶e̶ ̶s̶t̶r̶i̶n̶g̶ ̶3̶.̶ ̶C̶a̶l̶c̶u̶l̶a̶t̶e̶ ̶t̶h̶e̶ ̶p̶h̶r̶a̶s̶e̶- ̶f̶r̶e̶q̶u̶e̶n̶c̶e̶ ̶f̶o̶r̶ ̶'̶s̶p̶l̶i̶t̶'̶ ̶s̶t̶r̶i̶n̶g̶s̶.̶.̶ ̶i̶.̶e̶.̶ ̶o̶n̶e̶s̶ ̶t̶h̶a̶t̶ ̶s̶t̶r̶a̶d̶d̶l̶e̶ ̶t̶h̶e̶ ̶m̶i̶d̶p̶o̶i̶n̶t̶ ̶o̶f̶ ̶t̶h̶e̶ ̶s̶t̶r̶i̶n̶g̶.̶ ̶ ̶T̶h̶i̶s̶ ̶i̶s̶ ̶o̶f̶f̶ ̶t̶h̶e̶ ̶t̶o̶p̶ ̶o̶f̶ ̶m̶y̶ ̶h̶e̶a̶d̶ ̶s̶o̶ ̶t̶h̶e̶r̶e̶ ̶m̶a̶y̶ ̶b̶e̶ ̶u̶n̶f̶o̶r̶s̶e̶e̶n̶ ̶c̶o̶m̶p̶l̶i̶c̶a̶t̶i̶o̶n̶s̶ ̶I̶'̶m̶ ̶n̶o̶t̶ ̶t̶h̶i̶n̶k̶i̶n̶g̶ ̶o̶f̶,̶ ̶b̶u̶t̶̶t̶h̶e̶̶p̶r̶i̶n̶c̶i̶p̶l̶e̶̶i̶s̶̶t̶h̶e̶r̶e̶。̶ ̶ ̶T̶B̶H̶ ̶t̶h̶i̶s̶ ̶s̶o̶u̶n̶d̶s̶ ̶l̶i̶k̶e̶ ̶a̶ ̶p̶r̶o̶b̶l̶e̶m̶ ̶t̶h̶a̶t̶ ̶c̶o̶m̶e̶s̶ ̶f̶r̶o̶m̶ ̶a̶n̶ ̶a̶l̶g̶o̶r̶i̶t̶h̶m̶ ̶d̶e̶s̶i̶g̶n̶ ̶t̶e̶x̶t̶b̶o̶o̶k̶ ̶a̶n̶d̶ ̶p̶r̶o̶b̶a̶b̶l̶y̶ ̶h̶a̶s̶ ̶a̶ ̶v̶e̶r̶y̶ ̶n̶e̶a̶t̶ ̶s̶o̶l̶u̶t̶i̶o̶n̶ ̶s̶o̶m̶e̶w̶h̶e̶r̶e̶ ̶a̶l̶r̶e̶a̶d̶y̶.̶
编辑:然而,最优化的解决方案是建立一个后缀树