1 #include<stdio.h> 2 #include<string.h> 3 4 //定義子串參數結構體 5 struct sub_str 6 { 7 char sstr[61]; //子串 8 int len; //子串長度 9 int times; //子串出現的次數 10 }; 11 12 int main() 13 { 14 int i,j,k; 15 int l,l_temp; //l:用於記錄輸入的要統計的子串的最小長度;l_temp:用於記錄遍歷子串時的臨時動態子串長度 16 char str[61],sstr_temp[61]; //str:用於指向輸入的要統計的字符串;sstr_temp:用於指向當前統計的子串 17 int str_len; //用於記錄輸入的要統計的字符串的長度 18 struct sub_str substr[1830]; //substr[1830]:用於記錄各個子串的參數,最多有1+2+3+···+60個子串 19 struct sub_str substr_temp; //substr_temp:用於對substr[1830]中的子串進行排序時交換順序的臨時中間結構體變量 20 int sstr_num=0; //用於統計存入substr[1830]中的實際子串數量 21 int max_times; //用於記錄子串出現的最大次數 22 23 //輸入 24 scanf("%d",&l); //輸入統計的子串的最小長度 25 getchar(); //除去輸入時的回車鍵 26 gets(str); //輸入要統計的字符串 27 28 str_len=strlen(str); //得到輸入的要統計的字符串的長度 29 30 //初始臨時動態子串長度為最大長度,遍歷要統計的字符串中滿足長度的子串 31 for(l_temp=str_len;l_temp>=l;l_temp--) 32 { 33 for(i=0;i<str_len-l_temp;i++) //長度為l_temp的子串在長度為str_len的字符串中有str_len-l_temp個 34 { 35 for(j=i,k=0;j<i+l_temp;j++,k++) //得到當前要統計的子串 36 sstr_temp[k]=str[j]; 37 38 for(k=0;k<sstr_num;k++) //查詢 substr[1830] 中是否存在當前要統計的子串 39 if(strcmp(sstr_temp,substr[k].sstr)==0) //有,則使該子串的出現次數加1 40 { 41 substr[k].times++; 42 break; 43 } 44 45 if(k==sstr_num) //沒有,則在 substr[1830] 中新增該子串,並初始化各個參數 46 { 47 strcpy(substr[sstr_num].sstr,sstr_temp); 48 substr[sstr_num].len=l_temp; 49 substr[sstr_num].times=1; 50 sstr_num++; // substr[1830] 中實際的子串數量加1 51 } 52 53 memset(sstr_temp,0,sizeof(sstr_temp)); //清 0 sstr_temp[61],繼續遍歷該長度的子串 54 } 55 } 56 57 //采用冒泡排序法對 substr[1830] 中的子串根據出現次數進行排序 58 for(i=0;i<sstr_num-1;i++) 59 { 60 for(j=i;j<sstr_num;j++) 61 { 62 if(substr[j].times>substr[i].times) 63 { 64 for(k=0;k<61;k++) 65 substr_temp.sstr[k]=substr[i].sstr[k]; 66 substr_temp.len=substr[i].len; 67 substr_temp.times=substr[i].times; 68 69 for(k=0;k<61;k++) 70 substr[i].sstr[k]=substr[j].sstr[k]; 71 substr[i].len=substr[j].len; 72 substr[i].times=substr[j].times; 73 74 for(k=0;k<61;k++) 75 substr[j].sstr[k]=substr_temp.sstr[k]; 76 substr[j].len=substr_temp.len; 77 substr[j].times=substr_temp.times; 78 } 79 } 80 } 81 82 //輸出 83 puts(substr[0].sstr); 84 85 return 0; 86 }