关于查找字符串中最大重复子串分析

  浩浩荡荡的求职历程开始了,腾讯,百度,阿里的投放系统一直是我的目标。上周面试腾讯搜搜时,考官问过这么个问题:如何查找一个字符串中的最大重复子串。

比如: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//不知此处耗时理解是否正确

总结起来感觉网上的算法较优

posted @ 2013-03-09 15:58  蒋小诚  阅读(2463)  评论(0)    收藏  举报