算法训练 字串统计
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
#include <stdio.h>
#include <string.h>
int main()
{
char S[65] = { 0 };
int L, len;
scanf("%d", &L);
scanf("%s", S);
len = (int)strlen(S);
int current_start, current_end, current_times, max_start, max_end, max_times = -1, equal;
for (int i = 0; i < len - L + 1; ++i)
{
for (current_start = i, current_end = current_start+L-1; current_end < len; ++current_end)
{
current_times = 1;
for (int p = current_start+1, q = current_end+1; q < len; ++p, ++q)
{
equal = 1;
for (int k = 0; k < current_end - current_start + 1; ++k)
{
if (S[current_start + k] != S[p + k])
{
equal = 0;
break;
}
}
if (equal)
current_times++;
}
if (current_times > max_times)
{
max_times = current_times;
max_start = current_start;
max_end = current_end;
}
else if (current_times == max_times && (current_end - current_start + 1) > (max_end - max_start + 1))
{
max_times = current_times;
max_start = current_start;
max_end = current_end;
}
}
}
for (int p = max_start; p <= max_end; ++p)
printf("%c", S[p]);
return 0;
}