这也是一道例题
给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠。
算法分析:
这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组。不
同的是,这里要判断的是有没有一个组的后缀个数不小于 k。如果有,那么存在
k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为 O(nlogn)。
我们可以通过二分子串的长度k来做,这时就将题目变成了是否存在重复次数至少为K次且长度不小k的字符串。
首先我们可以把相邻的所有不小于k的height[]看成一组,这组内有多少个字符串,
就相当于有多少个长度至少为k的重复的子串。
之所以可以这么做,是因为排名第i的字符串和排名第j的字符串的最长公共前缀
等于height[i],height[i+1],...,height[j]中的最小值,所以把所有不小于k的height[]看成
一组就保证了组内任意两个字符串的最长公共前缀都至少为k,且长度为k的前缀是每个字符串共有的,
因此这组内有多少个字符串,就相当于有多少个长度至少为k的重复的子串(任意一个子串都是某个后缀的前缀)。
Source Code:
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include
#include
#include
#include
#include
#include
#include <string>
#include