后缀数组:最长重复子串 (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)
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)
相关文章推荐
- poj 3261(后缀数组,求可重叠的k次最长重复子串)
- poj 1743 二分答案+后缀数组 求不重叠的最长重复子串
- 最长重复子串(后缀数组思想)
- 求最长重复子串(后缀数组)
- 后缀数组求最长重复子串
- 后缀数组求最长重复子串
- 后缀数组模版 及 可重叠和不可重叠最长重复子串【for_wind】
- POJ - 1743 Musical Theme (后缀数组求不可重叠最长重复子串)
- 后缀数组(不可重叠最长重复子串)
- Hiho 122 后缀数组三·重复旋律3(多个串的最长公共重复子串)
- poj 3261 Milk Patterns 后缀数组 最长重复子串
- poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
- poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
- POJ 3261 Milk Patterns 求可重叠的 k 次最长重复子串(后缀数组)
- poj1743 Musical Theme(后缀数组--不可重叠最长重复子串+二分)
- 后缀数组 不重叠最长重复子串 POJ 1743
- 后缀数组 最长不可重叠重复子串问题
- Hdu 4080 & Poj 3882 Stammering Aliens (后缀数组 可重叠k次最长重复子串)
- 后缀数组求最长重复子串
- poj 3882 后缀数组 求一个串至少出现k次的最长重复子串的长度