LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。
个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)
4.17: 最常见的单词
LeetCode 819,点击题目可直接跳转至LeetCode
题意
给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。
题目保证至少有一个词不在禁用列表中,而且答案唯一。
禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
题解:模拟
直接按照题意模拟
- 首先将所有字母转化为小写字母
- 截取段落中所有的单词存储到一个哈希表中,key存储单词,value存储单词出现的次数
- 在哈希表中找出出现次数最多,且不在禁用列表中的单词
注意:截取段落中的所有单词可能会存在一些小细节,需要留意下(例如最后一个单词末尾可能是字母或者是其他字符等)
C++代码:
class Solution {
public:
char s[7]={' ','!','?',''',',',';','.'};
int get_minpos(string paragraph,int pos){
int n=paragraph.size();
int res=n-1;
for(int i=pos;i<n;i++){
for(int j=0;j<7;j++){
if(paragraph[i]==s[j]){
res=i;break;
}
}
if(res!=n-1) break;
}
return res;
}
string mostCommonWord(string paragraph, vector<string>& banned) {
int n=paragraph.size();
//先将字符串中所有字母转化为小写
for(int i=0;i<n;i++){
if(paragraph[i]>='A'&¶graph[i]<='Z') paragraph[i]+=32;
}
// cout<<paragraph<<endl;
map<string,int> mp;
int pos=0;
while(pos<n-1){
int p=get_minpos(paragraph,pos);
string str;
if(paragraph[p]>='a'&¶graph[p]<='z') str=paragraph.substr(pos,p-pos+1);
else str=paragraph.substr(pos,p-pos);
// cout<<pos<<"--"<<p<<"---"<<str<<endl;
if(str!="") mp[str]++;
pos=p+1;
}
int maxnum=0;string ans;
for(auto it:mp){
if(count(banned.begin(),banned.end(),it.first)) continue;
if(it.second>maxnum){
maxnum=it.second;ans=it.first;
}
}
return ans;
}
};