您的位置:首页 > 其它

后缀数组:最长重复子串 (marked)

2013-09-12 20:54 260 查看
最长重复子串  
http://www.cppblog.com/unixfy/archive/2011/09/13/155668.aspx 最长重复子串

问题描述

给定一个字符串,求出其最长重复子串

例如 abcdabcd

最长重复子串是 abcd

最长重复子串可以重叠

例如

abcdabcda

这时最长重复子串是 abcda

中间的 a 是被重叠的。

直观的解法是,首先检测长度为 n - 1 的字符串情况,如果不存在重复则检测 n - 2, 一直递减下去,直到 1 。

这种方法的时间复杂度是 O(N * N * N),其中包括三部分,长度纬度、根据长度检测的字符串数目、字符串检测。

改进的方法是利用后缀数组

后缀数组是一种数据结构,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。

这样的时间复杂度为:

生成后缀数组 O(N)

排序 O(NlogN*N) 最后面的 N 是因为字符串比较也是 O(N)

依次检测相邻的两个字符串 O(N * N)

总的时间复杂度是 O(N^2*logN), 由于第一种方法的 O(N^3)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: