我正在尝试查找字符串中最常见的字母。
这是给我的提示,但无法弄清楚
- 将大小为26的整数数组初始化为全零(假设此数组为letterCount)
- 将输入字符串转换为所有小写字母(假设字符串为encodeString)
- 使用for循环逐个字符地遍历字符串。使用isalpha检查字符是否为字母字符。如果是这样,则按如下所示增加数组:
letterCount[encodedstring[x]-97]++
编辑:我的代码
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
}
答案 0 :(得分:1)
您没有执行步骤2:
- 将输入字符串转换为所有小写字母(假设字符串为encodeString)
这很重要,因此'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
}