在字符串中查找最常见的字母

时间:2019-11-13 22:42:55

标签: c++

我正在尝试查找字符串中最常见的字母。

这是给我的提示,但无法弄清楚

  
      
  1. 将大小为26的整数数组初始化为全零(假设此数组为letterCount)
  2.   
  3. 将输入字符串转换为所有小写字母(假设字符串为encodeString)
  4.   
  5. 使用for循环逐个字符地遍历字符串。使用isalpha检查字符是否为字母字符。如果是这样,则按如下所示增加数组:letterCount[encodedstring[x]-97]++
  6.   

编辑:我的代码

int computeShift(std::string fileContent)
{
    int letterCount[26] = { 0 };
    for (int i = 0; i < fileContent.length(); i++)
    {
        if (isalpha(fileContent[i]))
        {
            letterCount[fileContent[i]-97]++;
        }
    }
    return 3; //Temporary
}

1 个答案:

答案 0 :(得分:1)

您没有执行步骤2:

  
      
  1. 将输入字符串转换为所有小写字母(假设字符串为encodeString)
  2.   

这很重要,因此'a''A'都可以映射到数组索引0,'b''B'都可以映射到索引1,依此类推

因此您可以:

  • 在遍历输入字符串之前将其转换为所有小写字母:
#include <cctype>

std::string str_tolower(std::string s) {
    std::transform(s.begin(), s.end(), s.begin(), 
        [](unsigned char c){ return std::tolower(c); }
    );
    return s;
}

int computeShift(std::string fileContent)
{
    int letterCount[26] = { 0 };
    std::string fileContentLowerCase = str_tolower(fileContent);

    for (int i = 0; i < fileContentLowerCase.length(); ++i)
    {
        if (std::isalpha(fileContentLowerCase[i]))
        {
            letterCount[fileContentLowerCase[i]-'a']++;
        }
    }

    return 3; //Temporary
}
  • 按原样保留输入字符串,而使用isupper()islower()
#include <cctype>

int computeShift(std::string fileContent)
{
    int letterCount[26] = { 0 };

    for (int i = 0; i < fileContent.length(); ++i)
    {
        if (std::isalpha(fileContent[i]))
        {
            int index = std::isupper(fileContent[i])
                ? (fileContent[i]-'A')
                : (fileContent[i]-'a');
            letterCount[index]++;
        }
    }

    return 3; //Temporary
}