计算字符串中最常见的字符

时间:2018-04-19 23:07:00

标签: c string function

我有一个复杂的C程序,我只想写一个函数,它将一个字符串作为参数。

int most_frequent(char *string)

该函数必须返回字符串中最常用字符的编号。我试过这样的事情,但我认为这是不正确的:

 int most_frequent(char *string){
     int i, lenght;
     lenght=strlen(string);
     int max=0, x=0;
     for(i=0;i<lenght;i++)
     {
         if(string[i]==string[i++])
         {
             x++;
         }
         if(max<x)
             max=x;
     }
     return max;
 }

例如:“溢出” - 2              “十一” - 3

2 个答案:

答案 0 :(得分:5)

我假设您有一个遵循ASCII的字符串。这样,每个char有256个可能的值。因此,我们计算每个的频率并返回最大的频率。

int most_frequent(char *string){
     int count[256] = {0}; // Assum char is ASCII
     int max = 0;
     int i;

     for(i=0; i < strlen(string) ;i++) {
         count[(unsigned char)(string[i])] ++;
     }

     for(i=0; i < 256 ;i++) {
         if (count[i] > max) 
             max = count[i];
     }
     return max;
 }

答案 1 :(得分:2)

请执行以下操作:

// version that ignores the upper and lower case
int most_frequent(char *string) {
    int letterCout[26];

    // counts occurrence of each letter 
    for (int i = 0; i < strlen(string); ++i){
       // this counts characters if you are ignoring the case (upper or lower)
       if (string[i] >= 'a' && string[i] =< 'z')
           alphabet [string[i] - 'a']++;
       else if (string[i] >= 'A' && string[i] =< 'Z')
           alphabet [string[i] - 'A']++;
    }

    // finds which letter occurred the most
    int max = 0;
    for (int i = 0; i < strlen(string); ++i)
        if (letterCoutn[i] > max)
            max = letterCount[i];

    return max;
}

或者你可以这样做:

// version which does not ignore case but count the separately
int most_frequent(char *string) {
    int letterCout[52];  // 52 so you can count upper and lower case

    // counts occurrence of each letter 
    for (int i = 0; i < strlen(string); ++i){
       if (string[i] >= 'a' && string[i] <= 'z')
           alphabet [string[i] - 'a' + 26]++; // plus 26 so to offset in array so upper case could be counted in lower half of an array.
       else if (string[i] >= 'A' && string[i] <= 'Z')
           alphabet [string[i] - 'A']++;
    }

    // finds which letter occurred the most
    int max = 0;
    for (int i = 0; i < strlen(string) * 2; ++i)
        if (letterCoutn[i] > max)
            max = letterCount[i];

    return max;
}