分析:首先生成后缀数组

 1 //求一个字符串中连续出现次数最多的子串
 2 
 3 #include "stdafx.h"
 4 #include <iostream>
 5 #include <vector>
 6 #include <string>
 7 using namespace std;
 8 
 9 pair<int,string> fun(const string &str)
10 {
11     vector<string> subStrs;
12     int maxcount=1,count=1;
13     string subStr;
14     int i,len=str.length();
15     for(i=0;i<len;i++)    //生成后缀数组
16         subStrs.push_back(str.substr(i,len-i));
17     for(i=0;i<len;i++)
18     {
19         for(int j=i+1;j<len;j++)
20         {
21             count=1;
22             if(subStrs[i].substr(0,j-i)==subStrs[j].substr(0,j-i))
23             {
24                 ++count;
25                 for(int k=j+(j-i);k<len;k+=j-i)//间隔(j-i)个字母后,看是否重复出现,重复出现则连续
26                 {
27                     if(subStrs[i].substr(0,j-i)==subStrs[k].substr(0,j-i))
28                         ++count;
29                     else 
30                         break;
31                 }
32                 if(count>maxcount)
33                 {
34                     maxcount=count;
35                     subStr=subStrs[i].substr(0,j-i);
36                 }
37             }
38         }
39     }
40     return make_pair(maxcount,subStr);
41 
42 }
43 
44 
45 int _tmain(int argc, _TCHAR* argv[])
46 {
47     string str;
48     pair<int,string> rs;
49     while(cin>>str)
50     {
51         rs=fun(str);
52         cout<<rs.second<<":"<<rs.first<<"\n";
53     }
54     return 0;
55 }

 

然后再逐渐缩小字符子串来得出正确的结果

  subStrs[0]比subStrs[1]多了一个字母,如果说存在连续匹配的字符,那么
  subStrs[0]的第1个字母要跟subStrs[1]首字母匹配,同理
  subStrs[0]的前2个字母要跟subStrs[2]的前2个字母匹配(否则不能叫连续匹配)
  subStrs[0]的前n个字母要跟subStrs[n]的前n个字母匹配.
 如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串.