思想:以字符串“abcbcbcabc”为例
step 1. 穷举出源字符串的所有后缀:
substr[0] =abcbcbcabc
substr[1] =bcbcbcabc
substr[2] =cbcbcabc
substr[3] =bcbcabc
substr[4] =cbcabcsubstr[5] =bcabc
substr[6] =cabcsubstr[7] =abc
substr[8] =bc
substr[9] =c
setp 2.
substr[0]比substr[1]多一个字母,如果连续出现相同子串,那么
substr[0]的第一个字母要与substr[1]的第一个字母相同;
substr[0]的前两个字母要与substr[2]的前两个字母相同(f否则不能叫连续匹配);
substr[0]的前三个字母要与substr[3]的前三个字母相同;
.................................................................................................
substr[0]的前n个字母要与substr[n]的前n个字母相同,
保存匹配成功次数最多的字串。
pair<string, int> func(const string & str)
{
vector<string> vSubStr;
int iMaxCount = 1; //连续出现的字串的最多次数
int iCount = 1;
string strSubStr; //连续出现次数最多的字串
int iLen = str.length();
int i, j, k;
//获取源字符串的后缀字串,并保存在在vector中
for (i = 0; i < iLen; i++)
{
vSubStr.push_back(str.substr(i, iLen - i));
}
//打印后缀字串
cout << "##########################################" << endl;
for (i= 0; i < iLen; i++)
{
cout << vSubStr[i] << endl;
}
cout << "#########################################" << endl;
//从第一个子串起,依次后后续子串的前j - i个字符串相比
for (i = 0; i < iLen; i++)
{
for (j = i + 1; j < iLen; j++)
{
iCount = 1;
if (vSubStr[i].substr(0, j - i) == vSubStr[j].substr(0, j - 1))
{
++iCount;
for (k = j + (j - i); k < iLen; k += j - i)
{
if (vSubStr[i].substr(0, j - i) == vSubStr[k].substr(0, j - i))
{
++iCount;
}
else
{
break;
}
}
if (iCount >= iMaxCount)
{
iMaxCount = iCount;
strSubStr = vSubStr[i].substr(0, j - i);
}
} //if
}
}
return make_pair(strSubStr, iMaxCount);
}