问题描述 :
给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入说明 :
第一行一个数字L。
第二行是字符串S。
L大于0,且不超过S的长度。
n<=60
S中所有字符都是小写英文字母。
输出说明 :
一行,题目要求的字符串。
输入样例1:
4
bbaabbaaaaa
输出样例1:
bbaa
输入样例2:
2
bbaabbaaaaa
输出样例2:
aa
输入范例 :
4
bbaabbaaaaa
输出范例 :
bbaa
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1000
//返回str中从start位置开始的len个字符
void getsub(char str[],int start,int len,char subs[]){
int i,j=0;
for(i=start;i<start+len;i++)
subs[j++]=str[i];
subs[j]='\0';
}
int main(){
int i,j,k,c,maxc,maxlen,L,len;
char s[max],sub[max],tsub[max],maxsub[max];
scanf("%d",&L);
getchar();
gets(s);
len=strlen(s);
if(len==L)
puts(s);
else{
//最大出现次数以及字符串长度
maxc=0;
maxlen=0;
//每次选取字符串长度为i
for(i=L;i<=len;i++){
for(j=0;j<=len-i;j++){
//首先获得一个长度i的子字符串
getsub(s,j,i,sub);
c=0;
for(k=0;k<=len-i;k++){
getsub(s,k,i,tsub);
//统计sub子串出现的次数
if(strcmp(sub,tsub)==0)
c++;
}
if(maxc<c||(maxc==c&&i>maxlen)){
strcpy(maxsub,sub);
maxc=c;
maxlen=i;
}
}
}
puts(maxsub);
}
return 0;
}
版权声明:本文为qq_38949748原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。