【LeetCode每日一题打卡】819. 最常见的单词

296 阅读1分钟

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

个人博客链接:bbstudy.net/ (等毕业论文做好后续会完善相关功能)

4.17: 最常见的单词

LeetCode 819,点击题目可直接跳转至LeetCode

题意

给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。

题目保证至少有一个词不在禁用列表中,而且答案唯一。

禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。

题解:模拟

直接按照题意模拟

  1. 首先将所有字母转化为小写字母
  2. 截取段落中所有的单词存储到一个哈希表中,key存储单词,value存储单词出现的次数
  3. 在哈希表中找出出现次数最多,且不在禁用列表中的单词

注意:截取段落中的所有单词可能会存在一些小细节,需要留意下(例如最后一个单词末尾可能是字母或者是其他字符等)

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'&&paragraph[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'&&paragraph[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;
    }
};