介绍
假如要实现这样一个功能,给定一个字符串str,找出str中重复的最长的子串,比如,给定”banana”,其中最长的出现重复的子串为ana(分别出现在第1个位置和第3个位置上),穷解法的时间复杂度为O(m * n^2),利用后缀数组可以在O(nlogn + n)的复杂度下实现此功能。
比如给定一个字符串”banana”,先列出其后缀:
然后对后缀进行排序
然后对排好序的后缀进行一次线性扫描即可找出”banana”中出现重复的最长的子串为”ana”,时间复杂度为O(nlogn + n)
实现
具体实现如下:
运行程序,输入banana,输出结果如下:
应用
稍微修改以上给出的代码,读取《鲁宾逊漂流记》里面的内容,然后找出小说中重复过的最长的一句话:
that if i did take this foolish step, god would not bless me, and i would have leisure hereafter to reflect upon having neglected his counsel
后缀数组还可用在文本编辑器的字符串搜索上,因为在文本编辑器中,可能需要频繁地进行搜索操作,所以每次搜索都使用KMP或者BM算法对文本就行遍历一遍那是不可行的,可以利用后缀数组建立后缀树(skiplist也可以),这样每次搜索的成本就降到了O(logn),大大提升了性能。
参考
《编程珠玑》第十五章 珍珠字符串