Board logo

標題: 遞迴函數_找出頻率最高的子字串 [打印本頁]

作者: may    時間: 2023-5-9 13:00     標題: 遞迴函數_找出頻率最高的子字串

請編寫一個 C 遞迴函數 freqTrans(str) 來識別和輸出最頻繁的子字串,給出一系列小寫字母。如果頻率相同。請打印最小的字母順序。 例如,
freqTrans(“abababbbabbba”);
will print
a ->b, Frequency:4.

freqTrans(“abcdeabcdeaabbc”);
will print
a ->b, Frequency:3.

freqTrans(“ijklmnopqrs”);
will print
i ->j, Frequency:1.

freqTrans(“lllloooovvvveeee”);
will print
e->e, Frequency:3.
作者: 李泳霖    時間: 2023-5-11 18:09

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <cstdlib>

  4. int main(void) {
  5.   char n[80];
  6.    int tc0[26]={0};
  7.   int tc[26]={0};
  8.   int tn[26]={0};
  9.   int c1[26]={0};
  10.   int c2[26]={0};
  11.   int n2[26]={0};
  12.   int b[26]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
  13.   printf("請輸入字串");
  14.   scanf("%s", n);

  15.   for (int i = 0; i < strlen(n); i++) {
  16.           // printf("b[%d]=%d\n",i,b[i]);
  17.       if((b[(int)n[i]-97])==1){
  18.                   b[(int)n[i]-97]=0;
  19.                   c1[i]=(int)n[i];

  20. //printf("目前:tc0[%d]=%d\n",(int)n[i]-97,tc0[(int)n[i]-97]);
  21.     for(int k=i;k<strlen(n);k++)
  22.       {
  23.         if((int)n[i]==(int)n[k])
  24.         {
  25.       
  26.           tc[(int)n[k+1]-97]=(int)n[k+1];
  27.           tn[(int)n[k+1]-97]++;
  28.          
  29.       
  30.         }
  31.       }

  32.    for(int j=0;j<26;j++)
  33.     {   
  34.         if(n2[i]<tn[j])
  35.         {
  36.          
  37.           n2[i]=tn[j];
  38.           c2[i]=tc[j];      
  39.         }
  40.     }
  41.     for(int x=0;x<26;x++)
  42.       {
  43.         tc[x]=0;
  44.         tn[x]=0;
  45.       }
  46.   }
  47.   else
  48.           continue;
  49. }
  50. int sum=0;
  51. for(int i=0;i<26;i++)
  52. {
  53.         if(b[i]==1)
  54.                 sum+=1;
  55. }
  56. int maxc1=0,maxc2=0,maxn=0,get=1,index=0;
  57. for(int i=0;i<26;i++)
  58.     {
  59.     //  printf("i:%d,%d\n",i,c1[i]);
  60.      if(n2[i]>0 && c1[i]>0)
  61.              if(n2[i]>maxn)
  62.              {
  63.                      maxc1=c1[i];
  64.                      maxc2=c2[i];
  65.                      maxn=n2[i];
  66.                  }

  67.      
  68.     }
  69.           
  70.         for(int i=0;i<26;i++)
  71.     {
  72.              if(maxn==n2[i])
  73.              {
  74.                      get++;  
  75.                     
  76.             }

  77.                         //printf("c[%d]=%d有\n",i,c1[i]);
  78.     }       
  79.      if(get>1)
  80.     {
  81.             int nc=123;
  82.             for(int i=0;i<26;i++)
  83.             {
  84.                      if(c1[i]<=nc && n2[i]==maxn)
  85.                      {
  86.                              maxc1=c1[i];
  87.                              maxc2=c2[i];
  88.                              maxn=n2[i];
  89.                              nc=c1[i];
  90.                          }
  91.                             
  92.             }       
  93.            
  94.         }
  95.    /* else*/
  96.             printf("%c->%c,Frequency:%d\n",maxc1,maxc2,maxn);
  97.   system("pause");
  98.   return 0;
  99. }
複製代碼

作者: 李泳霖    時間: 2023-5-11 19:57

  1. #include <stdio.h>
  2. #include <string.h>
  3. //#include <cstdlib>

  4. int main(void) {
  5.   char n[80];
  6.   int i,k,j,x;
  7.    int tc0[26]={0};
  8.   int tc[26]={0};
  9.   int tn[26]={0};
  10.   int c1[26]={0};
  11.   int c2[26]={0};
  12.   int n2[26]={0};
  13.   int b[26]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
  14.   printf("請輸入字串");
  15.   scanf("%s", n);

  16.   for ( i = 0; i < strlen(n); i++) {
  17.           // printf("b[%d]=%d\n",i,b[i]);
  18.       if((b[(int)n[i]-97])==1){
  19.                   b[(int)n[i]-97]=0;
  20.                   c1[i]=(int)n[i];

  21. //printf("目前:tc0[%d]=%d\n",(int)n[i]-97,tc0[(int)n[i]-97]);
  22.     for( k=i;k<strlen(n);k++)
  23.       {
  24.         if((int)n[i]==(int)n[k])
  25.         {
  26.       
  27.           tc[(int)n[k+1]-97]=(int)n[k+1];
  28.           tn[(int)n[k+1]-97]++;
  29.          
  30.       
  31.         }
  32.       }

  33.    for( j=0;j<26;j++)
  34.     {   
  35.         if(n2[i]<tn[j])
  36.         {
  37.          
  38.           n2[i]=tn[j];
  39.           c2[i]=tc[j];      
  40.         }
  41.     }
  42.     for( x=0;x<26;x++)
  43.       {
  44.         tc[x]=0;
  45.         tn[x]=0;
  46.       }
  47.   }
  48.   else
  49.           continue;
  50. }
  51. int sum=0;
  52. for( i=0;i<26;i++)
  53. {
  54.         if(b[i]==1)
  55.                 sum+=1;
  56. }
  57. int maxc1=0,maxc2=0,maxn=0,get=1,index=0;
  58. for( i=0;i<26;i++)
  59.     {
  60.     //  printf("i:%d,%d\n",i,c1[i]);
  61.      if(n2[i]>0 && c1[i]>0)
  62.              if(n2[i]>maxn)
  63.              {
  64.                      maxc1=c1[i];
  65.                      maxc2=c2[i];
  66.                      maxn=n2[i];
  67.                  }

  68.      
  69.     }
  70.           
  71.         for( i=0;i<26;i++)
  72.     {
  73.              if(maxn==n2[i])
  74.              {
  75.                      get++;  
  76.                     
  77.             }

  78.                         //printf("c[%d]=%d有\n",i,c1[i]);
  79.     }       
  80.      if(get>1)
  81.     {
  82.             int nc=123;
  83.             for( i=0;i<26;i++)
  84.             {
  85.                      if(c1[i]<=nc && n2[i]==maxn)
  86.                      {
  87.                              maxc1=c1[i];
  88.                              maxc2=c2[i];
  89.                              maxn=n2[i];
  90.                              nc=c1[i];
  91.                          }
  92.                             
  93.             }       
  94.            
  95.         }
  96.    /* else*/
  97.             printf("%c->%c,Frequency:%d\n",maxc1,maxc2,maxn);
  98.   system("pause");
  99.   return 0;
  100. }
複製代碼

作者: 李泳霖    時間: 2023-5-17 15:32

Please write a C function freqTrans(str) that identifies and prints the most frequent letter transition given a sequence of lower-case letters.if the frequency is the same,please print the smallest alphabetical order.For example
freqTrans("abababbbabbba")
will print
a->b,Frequency:4.
Hint : Lower-case letter ASCII is from 97 to 122.You may use functions in<ctype.h> and/or<string.h> if you'd like




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2