问题核心就是取出所有的子串都进行比对一次,然后取有重复且最长的那一个即可,那么怎么取出所有的子串呢?
从第一个开始,分别取c、ce、cee、ceea、ceeab...
从第二个开始,分别取e、ee、eea、eeab、eeabc...
从第三个开始,分别取e、ea、eab、eabc、eabcd...
从第四个开始,分别取a、ab、abc、abcd、abcda...
演示从第四个开始过程如下,将从当前位置开始的所有子串都找下是否有重复的,然后取出当前开始位置有重复的最大的一个即可
代码如下:如果有多个最长重复子串,可以将所有的最长重复子串取出
#include <iostream>
#include <vector>
#include <string>
using namespace std;
/*
*计算一个字符串中的有重复的最大字串
*ceeabcdabjcabceg
*得出的有重复的最大子串为abc
*/
int main()
{
string str = "ceeabcdabjcabc1234eg1234";
//string str = "ceeabbabbajcabceg";
vector<string> maxSubStrVect;
int maxSubStrLength = 0;
//控制从哪一个位置开始
for (int startPos = 0; startPos < str.length(); startPos++)
{
//当前剩下的字符串
string remainStr = str.substr(startPos + 1);
//控制从开始比对位置开始的1个字符,2个字符,3个字符,4个字符...找寻是否有重复的字符串,并且保证取最大的重复的那一个
for (int count = 1; count < str.length()-startPos; count++)
{
string compareStr = str.substr(startPos, count);
if (remainStr.find(compareStr) != remainStr.npos) //find函数如果找到了子串,那么返回子串位置,否则返回一个npos
{
//获取当前重复的子串和之前找到的重复子串中较长的一个
if (compareStr.length() > maxSubStrLength)
{
maxSubStrVect.clear();
maxSubStrVect.push_back(compareStr);
maxSubStrLength = compareStr.length();
}
else if (compareStr.length() == maxSubStrLength)
{
maxSubStrVect.push_back(compareStr);
}
}
}
}
cout << "该字符串中重复且最大的子串为:" << endl;
for (const string& val : maxSubStrVect)
{
cout << val << "\t";
}
getchar();
}