输入一个字符串,如何求最大重复出现的字符串呢?比如输入 ttabcftrgabcd,输出结果
为 abc,canffcancd,输出结果为 can。
#include <iostream>
#include <iterator>
using namespace std;
// 输出字符串中的最长重复子串,字串位置不重叠
// 比如输入ttabcftrgabcd输出abc
// 再比如输入canffcancd输出can
void compare(const char* str1, const char* str2,
pair<const char*, size_t>& maxDup)
{
// 验证参数有效性
if(str1 == NULL || str2 == NULL)
{
return;
}
const char* dupStart = NULL; // 当前重复子串起点
const char* maxStart = NULL; // 最长重复子串起点
size_t maxLen = 0; // 最长重复子串长度
size_t len = 0; // 当前重复子串的长度
while(*str1 != '\0' && *str2 != '\0')
{
if(*str1 == *str2)
{
if(len == 0)
{
dupStart = str1;
}
++len;
}
else if(len > 0)
{
if(len > maxLen)
{
maxLen = len;
maxStart = dupStart;
}
len = 0; // 将len重置为0表示当前位置不在重复子串中
}
++str1;
++str2;
}
if(maxLen > maxDup.second)
{
maxDup.first = maxStart;
maxDup.second = maxLen;
}
}
void dupInStr(const char* str)
{
// 验证参数有效性
if(str == NULL || *str == '\0')
{
return;
}
pair<const char*, size_t> maxDup;
maxDup.first = NULL;
maxDup.second = 0;
for(const char* subStr = str; *subStr != '\0'; ++subStr)
{
compare(str, subStr, maxDup);
}
copy(maxDup.first, maxDup.first + maxDup.second,
ostream_iterator<char>(cout, ""));
cout << endl;
}
int main(int argc, char* argv[])
{
const char* str1 = "ttabcftrgabcd";
const char* str2 = "canffcancd";
dupInStr(str1);
dupInStr(str2);
return 0;
}
运行结果:
abc
can