题目描述:
求一个串中出现的第一个最长重复子串
采用顺序结构存储串,编写一个程序,求串s中出现的第一个最长重复子串的下标和长度。
求解思路:
一、 主要数据结构及涉及知识点
核心结构:后缀数组
其他涉及:string 数据类型、 vector 容器 [ 顺序存储 ] 、 map<key,value> 容器、 STL 泛型算法 stable_sort
二、 算法的基本思想描述和流程框图
算法基本思想描述
首先,题目有一点小问题,没有说明最长重复字串是否可重叠,此处假设为可重叠,所以,问题归纳为:求一个串中出现的第一个最长可重叠子串。
一般解法:动态规划
但是用这一方法解此类问题,时间复杂度很难控制到O(N*logN) 以内。所以,求解此类问题,用后缀数组更为合适。
更优解法:后缀数组
那么何为后缀数组, 罗穗骞 在其 国家集训队论文《 后缀数组----处理字符串的有力工具 》一文中如下定义:
后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。