算法训练 字串统计
时间限制: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中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
思路已经在提示里了,但是如何实现,对于现在的我来说还不算简单,一开始我想着用二维数组来存枚举的字符串,空有思路却写不出代码,在网上搜了一番才发现其实并不难,只要一步一步来,多注意细节,就能ac。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char a[61];
char b[61][61];
int l;
int n;
cin >> l;
cin >>a;
n = strlen(a);
int j = 0;
int i = 0;
int p = 0;
//枚举所有情况
while (1) //使用while循环赋值 如果用for的话也可以
{
while (j < l) //枚举条件 题目要求不能比l长
{
b[i][j] = a[p];
j++;
p++;
}
b[i][j] = '\0'; //字符串结尾要加‘\0’作为结束标志
if (j == l&&i == n - l) break;//代表所有的子串都已经枚举到了,此时结束
j = 0;
i++;
p = p - l + 1;//每次挪一位 从a字符数组的下一位开始枚举 p的长度减去之前循环的l再加一就是下一位的下标(这里卡碟很久)
}
//枚举完毕 开始统计相同字符串的出现个数
int num[61] = { 0 };//用一个数组来记录不同的字符串出现的个数
for (j=0;j<=i;j++) //b数组从0开始 在枚举的时候 b有i个有意义的枚举
{
for (p=j+1;p<=i;p++)//b数组从1
{
if (strcmp(b[j], b[p]) == 0)
num[j]++; //如果出现相同字串 那么这个字串就加一
}
}
//统计出现个数完毕 开始最后的判断
int max=0;//下标
for (int n = 0; n <= i; n++)
{
if(num[max]<num[n])//如果次数小 则交换
{
max = n;
}
else if (num[max] == num[n])//如果次数一样多 需要找最长的
{
if(strlen(b[max])<strlen(b[n])) //用strlen函求长度后比较
{
max = n;
}
}
}
cout << b[max]; //查找完毕 输出
return 0;
}