题目链接:https://leetcode-cn.com/problems/most-common-word/
个人总结
- 本题使用哈希表的方法,对每个单词进行计数,同时判断是否出现在ban列表中,若出现则不计入表中;
- 注意for中的<=,因为我们需要对尾字母的下一个元素进行判断,来决定是否将前面的字母计入word;
- unordered_set,unordered_map是C++中的关联容器,关联容器的用法在下一篇博客-C转C++DAY4,在C++ Primer的关联容器解释中也有此题的类似用例;
- C++有一种类似Python的范围for语句,取范围的对象必须拥有能返回迭代器的begin和end成员。
代码
class Solution {
public:
string mostCommonWord(string paragraph, vector<string>& banned) {
//使用哈希表储存每个单词出现的次数
string word;//存储一个单词
unordered_set<string> banlist;
unordered_map<string, int> hashtable;
int maxfrequency = 0;
//将banned容器中的单词放入关联容器中,方便后续判断某单词出现的次数。
for(string &banword : banned){
banlist.emplace(banword);
}
//遍历字符串
for(int i = 0; i <= paragraph.size(); i++){
//如果当前元素是字母,转为小写压入word中
if(isalpha(paragraph[i])){
word.push_back(tolower(paragraph[i]));
}else if(!word.empty()){
//如果不是字符,并且不出现在ban列表中,将word压入hash,然后清空word
if(banlist.count(word) == 0){//判断ban中关键字等于word的元素的数量为否为0
hashtable[word]++;
maxfrequency = fmax(maxfrequency, hashtable[word]);
}
//记录一次单词后清空word
word.clear();
}
}
string ret;
//遍历哈希表,找出出现频率最大的单词
for(auto &[word, frequency] : hashtable){
if(frequency == maxfrequency){
ret = word;
break;
}
}
return ret;
}
};