算法训练 字串统计
算法训练 字串统计
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
第二行是字符串S。
L大于0,且不超过S的长度。
输出格式
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
数据规模和约定
n<=60
S中所有字符都是小写英文字母。
S中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
思路:按照提示的那样枚举所有可能的子串
len=strlen(s);
子串长度范围l~(len-1);
定义一个用来存储答案数组ans[]来存储最优答案
定义两个用来临时存储子串的数组mid_s[],mid_e[],第一个用来某一子串,第二个用来存储其他子串(包括第一个子串);
每枚举一个子串一,就跟子串二(子串一长度l时所有子串可能)相比较,如果相等出现次数mid_cnt++;每比完一个子串
都与自己需要的子串相比较,如果此时答案更优则更新答案,依次到长度为len-1.
下面上代码:
#include<stdio.h>
#include<string.h>
#define MAX 61
char s[MAX];
void find(char str[],int begin,int end)
{
int k=0;
int i;
for(i=begin;i<end;i++)
{
str[k++]=s[i];
}
str[k]='\0';
}
int main()
{
int l;
int len;
int i,j,k;
scanf("%d",&l);
scanf("%s",s);
len=strlen(s);
char ans_s[MAX];
int ans_cnt=0;
int ans_len;
char mid_s[MAX];
char mid_e[MAX];
int mid_cnt;
for(i=l;i<len;i++)
{
for(j=0;j<len-i;j++)
{
mid_cnt=0;
find(mid_s,j,j+i);
for(k=0;k<len-i;k++)
{
find(mid_e,k,k+i);
if(strcmp(mid_s,mid_e)==0)
{
mid_cnt++;
}
}
if(mid_cnt>ans_cnt)
{
ans_len=i;
ans_cnt=mid_cnt;
strcpy(ans_s,mid_s);
}
else if(mid_cnt==ans_cnt&&i>ans_len)
{
ans_len=i;
ans_cnt=mid_cnt;
strcpy(ans_s,mid_s);
}
}
}
printf("%s",ans_s);
return 0;
}
浙公网安备 33010602011771号