问题描述 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。 输入格式 第一行一个数字L。 第二行是字符串S。 L大于0,且不超过S的长度。 输出格式 一行,题目要求的字符串。 输入样例1: 4 bbaabbaaaaa 输出样例1: bbaa 输入样例2: 2 bbaabbaaaaa 输出样例2: aa 数据规模和约定 n<=60 S中所有字符都是小写英文字母。 提示 枚举所有可能的子串,统计出现次数,找出符合条件的那个
先上代码:
1 #include <stdio.h> 2 #include <string.h> 3 using namespace std; 4 5 int main(void) 6 { 7 int L; 8 char S[60+1]; 9 char c[60+1]; 10 char res[60+1]; 11 scanf("%d",&L); 12 scanf("%s",S); 13 14 int use = 0,max = 0; 15 int len = strlen(S); 16 if (L>0 && L<len) 17 { 18 //子串的长度 19 //倒序为了满足次数相同时,输出最长的子串 20 for (int k=len; k>=L; k--) 21 { 22 //遍历S字符串 23 for (int i=0 ; i<=len-k ; i++) 24 { 25 use = 0; 26 memcpy(c,&S[i],k); //用于比较的子串 27 for (int j=0 ; j<=len-k ; j ++) 28 { 29 if (memcmp(c,&S[j],k)==0) //字串相同,次数+1 30 use ++; 31 } 32 33 //次数相同时,输出最早出现的子串 34 if (use > max) 35 { 36 max = use; 37 memset(res,0,sizeof(res)); 38 memcpy(res,&S[i],k); 39 //printf("%s\t%d\n",res,max); 40 } 41 } 42 } 43 } 44 printf("%s\n",res); 45 46 return 0; 47 }
解题思路:
1.遍历不同的字符串长度(k)
2.取一个用于比较的子符串(c)
3.遍历字符串(S),查看与子串相同,次数+1