LeetCode刷题记录(十五):最常见的单词

154 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

最常见的单词

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

这道题看起来字很多,不过还是比较好理解的。

根据题目描述上来看,是想从一个长字符串中,获取一个出现次数最多的单词,并且存在一个禁用单词数组,保证这个结果不是这个禁用数组中的单词即可。

题目提供素材

题目提供了几个素材/参数:

  1. 一个长字符串,其中包含各种标点符号,以及大小写字母。

  2. 一个禁用单词数组,在这个数组中的单词不能出现在预期结果中。

注意:长字符串中包含的标点符号有:!?',;.,一定要考虑进去,不要只看例子,我第一次就漏掉了其他标点符号。

具体提示看题目描述。

我的解读

我对这道题目的解读,是有种逐级打怪的感觉。

逐步解决、清理数据,也就是长字符串。

将长字符串转小写,清理标点等等操作,再然后就容易多了。

解题思路

解题思路也和解读差不多。

第一步,先将长字符串全部通过java的toLowerCase方法转为小写。

第二步,使用replace方法将涉及到的标点符号替换成空格。

第三步,根据空格分隔成一个字符串数组,保证数组中每一个元素是一个单独的单词。

第四步,将禁用单词数组转换成一个Map集合,便于获取比对。

第五步,声明一个出现次数Map集合,用于记录每个单词出现的次数。

第六步,循环遍历分隔后的单词数组,并且在循环中判断元素是否是禁用单词,不是的话,存入或更新出现次数Map集合。

第七步,开始对比出现次数Map集合中,哪个单词对应的值最大。也是通过循环Map来一一对比即可,期间记录下最大的值和最大值对应的单词。

第八步,将结果单词返回。

代码

class Solution {
    public String mostCommonWord(String paragraph, String[] banned) {
        paragraph = paragraph.toLowerCase().replace("'", " ").replace(";", " ").replace(",", " ").replace("!", " ").replace("?", " ").replace(".", " ").replace("  ", " ");
        String[] paragraphs = paragraph.split(" ");
        Map<String,Integer> bannedMap = new HashMap<>();
        for (String b : banned) {
            bannedMap.put(b, 1);
        }
        Map<String,Integer> map = new HashMap<>();
        for (String s : paragraphs) {
            if (bannedMap.get(s) == null) {
                if (map.get(s) != null) {
                    int num = map.get(s) + 1;
                    map.put(s, num);
                } else {
                    map.put(s, 1);
                }
            }
        }
        String result = "";
        Integer resultNum = 0;
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if(entry.getValue() > resultNum){
                result = entry.getKey();
                resultNum = entry.getValue();
            }
        }
        return result;
    }
}

执行结果

本以为会执行的比较慢,后来发现这种方式更快,酷毙了。

image.png