关于查找字符串中最大重复子串分析
浩浩荡荡的求职历程开始了,腾讯,百度,阿里的投放系统一直是我的目标。上周面试腾讯搜搜时,考官问过这么个问题:如何查找一个字符串中的最大重复子串。
比如:abcdefgabcbc的最大子串就是abc.
因为工作习惯的问题,当时通过hash表+链表方式来回答,比如记录hashkey就是字母本身,value是一个链条,记录a出现的位置:
按照例子来说:
a->1,8
b->2,9,11
c->3,10,12
大致时间耗费=n*(len(sub_str)*sum(sub_str_times)),应该也是一个O(n^2)级别的算法,当然比最简单的三次循环好一点
--------------------------------------------------------------------------------------------------------------------------------
后来觉得面试不太顺,回来在网上搜索了一下。发现一个巧妙的利用字符数组下表的算法。
大致意思是,如果一个字符串存在一个长度为m的重复子串,那么在移动m次后,一定有连续m个位置与原串是相等的。(其实意思很简单,就是交换m次)
按照例子来说:
定义i=len(str)/2=6,定义j=i=6
for(i > 0;i--)
for(j < lenstr,j++)
if (str[j-i] == str[j])//此处表示j与挪动i个位置之后的字符表
repeat_len++
if repeat_len == i //参照解释如果有m个形同子串,m次一定会出现
start = j-2*i+1
finish
else//与第一个if对应
repeat_len = 0
此算法时间耗费:n+n^2/4,在数据变大的情况下,比我自己的算法要快很多
--------------------------------------------------------------------------------------------------------------------------
周末在温习编程珠玑的时候,发现另外一种算法:后缀数组
即统计每个单词的后缀数组:
a->abcdefgabcbc
b->bcdefgabcbc
...
a->abcbc
b->bcbc
之后在对这个数组进行排序:
a->abcdefgabcbc
a->abcbc
b->bcdefgabcbc
b->bcbc
再对相邻的数组比较前m个字段
此算法的耗时:n+nlogn+n^2//不知此处耗时理解是否正确
总结起来感觉网上的算法较优

浙公网安备 33010602011771号