首先分清楚什么是子串,比如:abc这个字符串,对应的子串为 a/b/c/ab/bc/abc
如果字符串是abcbcbcabc ,则连续出现次数最多的子串是bc,连续出现的次数为3
关键是连续,看代码可以结合例子来理解
代码如下:
#include <iostream>
#include <vector>
#include<string>
using namespace std;
pair<int ,string> fun(const string &str)
{
vector<string> substrs;
int maxcount=1,count=1;
string substr;
int i,len=str.length();
for(i=0;i<len;i++)
{
substrs.push_back(str.substr(i,len-i)); //把str字符串中的子串按每次把头部减少一个的方式插入到vector向量中
cout<<substrs[i]<<endl;//输出vector中的值 如上图
}
for(i=0;i<len;i++) //先从第一个子串开始直到所有的遍历完所有的子串
{
for(int j=i+1;j<len;j++) //从下一个子串开始 寻找连续出现的子串
{
count=1;
if(substrs[i].substr(0, j-i)==substrs[ j].substr(0, j-i)) //寻找以a开头的子串(对于本题的输入而言)下面依次为b开头的子串,一直到c开头的子串
{
++count;
for(int k=j+(j-i);k<len;k+=j-i)
{
if(substrs[i].substr(0, j-i)==substrs[k].substr(0, j-i)) ++count; //如果有连续一个子串出现就继续遍历vector的下一个子串中的和现在出现相同子串的地方的下一个或几个字符
else break;
}
if(count>maxcount) //maxcount 记录所有遍历中的最大连续子串出现的次数
{
maxcount=count;
substr=substrs[i].substr(0, j-i);
}
}
}
}
return make_pair(maxcount ,substr); //把maxcount 和 找到的子串做成pair<>返回
}
int main()
{
pair<int,string> result;
string str="abcbcbcabc";
result=fun(str);
cout<<result.first<<" "<<result.second<<endl; //输出为:2 ab
return 0;
}