最常见的单词
给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。
题目保证至少有一个词不在禁用列表中,而且答案唯一。
禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
思路:先分割字符串,提取出分割的字符(采用strtop_r函数)
因为strtop_r返回的是指向字符串的首地址,直接解引用会返回一个字符,所以采用while(指针!=nullptr);为什么不为空呢?因为strtop_r函数将分割符替换为了‘\0’;
因为不区分大小写,所以采用tolower(),将提取的字符转为小写。
使用map记录,不在禁用的就插入
代码分享:
class Solution {
public:
string mostCommonWord(string paragraph, vector<string>& banned) {
map<string, int> jishu;
string fenge{ " !?',;." };
char* p = nullptr;
char* p1 = nullptr;
p1 = strtok_r(const_cast<char*>(paragraph.c_str()), const_cast<char*>(fenge.c_str()), &p);
while (p1 != nullptr)
{
string temp{ };
while (*p1 != '\0')
{
temp += tolower(*p1) ;
p1++;
}
// cout << temp;
if (find(banned.begin(), banned.end(), temp) == banned.end())
{
if (jishu.find(temp) == jishu.end())
{
jishu.emplace(make_pair(temp, 1));
}
else
{
(*jishu.find(temp)).second++;
}
}
p1 = strtok_r(nullptr, const_cast<char*>(fenge.c_str()), &p);
}
auto m = jishu.begin();
for (auto s = jishu.begin();s != jishu.end();s++)
{
if (m->second < s->second)
{
m = s;
}
}
return m->first;
}
};
用到的函数:
strtop_r (原字符串,分割符,记录地址指针);
分割同一字符串时,第二次及以后,原字符串为nullptr;
tolower(字符) 大写转小写