lintcode 1369. 最频繁单词 map set

本文介绍了一种算法,用于从给定的段落中找出最频繁出现的非限定词,排除限定词列表中的词汇,同时忽略大小写和标点符号。通过使用map和set数据结构,算法能够高效地统计单词频率并找到目标单词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个段落和一组限定词,返回最频繁的非限定单词。已知至少有一个单词是非限定的,并且答案唯一。
限定词都是以小写字母给出,段落中的单词大小写不敏感。结果请返回小写字母。

样例1

输入: paragraph = "Bob hit a ball, the hit BALL flew far after it was hit." 和 banned = ["hit"]
输出: "ball"
解释:
"hit" 出现3次但是限定词。
"ball" 出现两次,是最频繁的非限定词。
注意段落中大小写不敏感。
标点符号请忽略 (即使紧挨单词,例如"ball,"), 
样例2

输入: paragraph = "a a a b b c c d" 和 banned = ["a","b"]
输出: "c"
解释:
"a"和"b"都是限定词
"c"出现了2次,而"d"只出现过一次
所以输出"c"
注意事项
1 <= paragraph.length <= 1000.
1 <= banned.length <= 100.
1 <= banned[i].length <= 10.
答案唯一,并且返回小写(即使以大写字母出现在段落中就,或是一个专有名词.)
段落仅由字母、空格、标点!?',;.组成。
不同的单词会被空格隔开.
没有连字符或者连字单词.
单词仅由小写字母组成,没有所有格或别的标点符号。
class Solution {
public:
    /**
     * @param paragraph: 
     * @param banned: 
     * @return: nothing
     */
    string mostCommonWord(string &paragraph, vector<string> &banned) {
        // 
        map<string,int> ans;
        set<string> judge(banned.begin(),banned.end());//找限定词
        string temp="";//得到每个单词
        for (int i = 0; i < paragraph.size(); i++) {//往map中添加单词
            /* code */
            if(isalpha(paragraph[i]))
            {
               if(isupper(paragraph[i]))  temp+=tolower(paragraph[i]);
               else temp+=paragraph[i];
            }
            else if(paragraph[i]==' '){ans[temp]++;temp="";}
        }
        ans[temp]++;//最后一个字符必为字母,单独处理
        int Max=0;
        for (auto i : ans) {
            /* code */
            if(!judge.count(i.first)&&i.second>Max)//不是限定词且出现次数最大
            {
                temp=i.first;//目前结果
                Max=i.second;//目前最大出现次数
            }
        }
        return temp;
    }
    
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值