算法思想:
1,如果一个串出现的次数为n,则其子串出现的次数必然不小于n.故该题本质上是求长度为T的各种子串的最大出现次数.
2,于是,将问题转化为类似于下面的问题:求一组数中出现的相同元素的最大次数.
例: 1, 2, 2, 3, 1, 4, 1 这组数中出现次数最多的是元素1,所以最大次数是3.
程序如下:
int myStrCom(const char * str, const char * dst, int len)
{ // 用于比较长度为len的两个串
int i = 0;
while (i < len)
{
if (*(str + i) == *(dst + i))
{
;
}
else
{
return (*(str + i) - *(dst + i));
}
i++;
}
return 0;
}
void maxNumString()
{
int T;
char str[10000 + 1] = "";
cin >> T;
cin >> str;
int len = strlen(str);
if (len < T)
{
cout << 0;
return ;
}
else if (len == T)
{
cout << 1;
return ;
}
bool flag[10000 + 1] = {false};
int curLen = len - T + 1;
int max = 0;
for (int i = 0; i <= len - T; i++)
{
if (flag[i] == true) // 已置相等标志,已经计算过了
{
continue;
}
int sum = 0;
for (int j = i + 1; j <= len - T; j++)
{
if (flag[j] == false) // 还未置相等标志,则需要比较
{
if (myStrCom(str + i, str + j, T) == 0)
{
sum++;
flag[i] = true; // 置相等标志
}
}
}
sum++; // 加上自身
if (sum > max)
{
max = sum;
}
}
cout << max;