字符串中连续出现次数最多的子串

分析:首先生成后缀数组

 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个字母匹配.
  如果匹配的并记下匹配次数.如此可以求得最长连续匹配子串. 

转载于:https://www.cnblogs.com/Mikuroro/p/4570212.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值