字串统计——蓝桥杯

 
问题描述
  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。
输入格式
  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。
输出格式
  一行,题目要求的字符串。

  输入样例1:
  4
  bbaabbaaaaa

  输出样例1:
  bbaa

  输入样例2:
  2
  bbaabbaaaaa

  输出样例2:
  aa
数据规模和约定
  n<=60
  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 } 

 

posted @ 2017-03-08 16:15  余小叙  阅读(566)  评论(0编辑  收藏  举报