字串统计——蓝桥杯
问题描述
给定一个长度为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中所有字符都是小写英文字母。
提示
枚举所有可能的子串,统计出现次数,找出符合条件的那个
分析:首先要看需要判断的条件:①出现次数最多
②如果有多个则选其中最长的
③ 如果有多个选择最第一次最早出现的
查找字串的时候首先根据L判断字符串的长度要从L到s-L,然后字符串长度一定,让字符串跟s的每四个字符进行判断,统计出出现的次数。
《个人理解》
1 #include<stdio.h> 2 #include<string.h> 3 int n; 4 char s[61]; 5 char str[61]; 6 char t[61]; 7 char maxs[61]; 8 int isin(char *s1,char *s2) 9 { 10 int num=0; 11 char *p,*q; 12 char *n=s1; 13 int f; 14 for(;*s1!='\0';s1++) 15 { 16 if (*s2==*s1) {/*判断字符串中是否有和要判断的字串首字符相同的字符*/ 17 num=s1-n; 18 f=1; 19 p=s1; /*s1 p为第一个相同字符的地址*/ 20 q=s2; 21 for(;*q!='\0';)/*如果有则判断接下去的几个字符是否相同*/ 22 { 23 if (*q++!=*p++) 24 { 25 f=0; 26 break; 27 } 28 } 29 if(f==1)//找到返回 30 { 31 break; 32 } 33 } 34 } 35 return(num); 36 } 37 void fun(){ 38 int i,j,k,p; 39 int max=0; 40 int num; 41 int sl=strlen(s)-n; 42 for(p=0;p<sl;p++){ 43 for(i=0;i<=sl-p;i++){ 44 num=0; 45 for(j=0;j<n+p;j++) { 46 str[j]=s[i+j]; 47 } 48 for(j=0;j<=sl-p;j++){ 49 for(k=0;k<n+p;k++){ 50 t[k]=s[j+k]; 51 } 52 if(strcmp(t,str)==0){ 53 num++; 54 } 55 } 56 if(max<=num){ 57 if(num==max) 58 { 59 if(strlen(str)>strlen(maxs)) 60 { 61 for(j=0;j<strlen(str);j++){ 62 maxs[j]=str[j]; 63 } 64 }else if(strlen(str)==strlen(maxs)) 65 { 66 if(isin(s,str)<isin(s,maxs)) 67 { 68 for(j=0;j<strlen(str);j++){ 69 maxs[j]=str[j]; 70 } 71 } 72 } 73 } 74 else 75 { 76 max=num; 77 for(j=0;j<strlen(str);j++) 78 maxs[j]=str[j]; 79 } 80 81 } 82 } 83 } 84 for(i=0;i<strlen(maxs);i++){ 85 printf("%c",maxs[i]); 86 } 87 88 } 89 int main() 90 { scanf("%d",&n); 91 scanf("%s",s); 92 fun(); 93 return 0; 94 }