algorithm - 较大循环串中的最小循环子串

标签 algorithm string knuth prefixes

我正在尝试找到一种算法,该算法可以返回较大循环字符串中最短循环子字符串的长度。

循环字符串将被定义为两个或多个相同字符串的串联,例如“abababab”或“aaaa”...

现在在给定的字符串 T = "abbcabbcabbcabbc"中有一个循环模式 "abbc"但最短的循环子字符串将是 "bb"。

最佳答案

如果您只是寻找出现不止一次的子串:

构建一个 Suffix tree来自字符串。

在创建后缀树时,可以统计每个子串的重复出现次数,保存在节点上出现的次数。

然后就做一个BFS search在树上(这将为您提供分层搜索,从较短的字符串到较长的字符串)并找到第一个大于 1 且出现不止一次的子字符串。

总复杂度:O(n) 其中 n 是字符串的长度

编辑:

The paths from the root to the leaves have a one-to-one relationship with the suffixes of S

您可以实现每个节点包含一个字母的树,这将为您提供更好的粒度并允许您按长度查看所有子字符串。

这是一棵香蕉的后缀树,其中每个节点都包含一个字母,您可以看到那里有所有子串。
enter image description here

如果您查看 applications后缀树的一部分,您会看到它正是用于此类任务 - 查找有关子字符串的内容。

从根看图,你可以看到所有的子字符串都是从根开始的(BFS列表):

b
a
n
ba
an
na
ban
ana
nan
bana
anan
nana
banan
anana
banana

关于algorithm - 较大循环串中的最小循环子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6459680/

相关文章:

android - 编写 .json 文件并在 Android 中读取该文件

c# - 帮助修复我的 KMP 搜索算法

assembly - TAOCP MIX汇编语言中 "ENT1 *"是什么意思?

c++ - 汇编程序任务 - 数组的最小值和最大值

c - 如何制作通用链表

algorithm - 通过放置适当的操作来最小化序列 ' DP'

java - 将字符串解析为 double - java

java - 如何知道不在一组数字中的最小值

javascript - 在 Javascript 中,如何转换字符串以便它可以用于调用属性?

c++ - 天真的 c++ 解决方案的无序映射