文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 哈希解法
    • 2.2 Trie树

1. 题目

设计一个方法,找出任意指定单词在一本书中的出现频率。

你的实现应该支持如下操作:

  • WordsFrequency(book)构造函数,参数为字符串数组构成的一本书
  • get(word)查询指定单词在数中出现的频率
示例:
WordsFrequency wordsFrequency = new WordsFrequency(
{"i", "have", "an", "apple", "he", "have", "a", "pen"});
wordsFrequency.get("you"); //返回0,"you"没有出现过
wordsFrequency.get("have"); //返回2,"have"出现2次
wordsFrequency.get("an"); //返回1
wordsFrequency.get("apple"); //返回1
wordsFrequency.get("pen"); //返回1提示:
book[i]中只包含小写字母
1 <= book.length <= 100000
1 <= book[i].length <= 10
get函数的调用次数不会超过100000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/words-frequency-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 哈希解法

class WordsFrequency {unordered_map<string,int> m;
public:WordsFrequency(vector<string>& book) {for(auto& s : book)m[s]++;}int get(string word) {return m[word];}
};

2.2 Trie树

参考Trie树

class Trie
{public:unordered_map<char,Trie*> next;bool isEnd = false;int count = 0;void insert(string& s){Trie *root = this;for(char ch : s){if(!(root->next).count(ch)){Trie* node = new Trie();root->next.insert(make_pair(ch,node));}root = root->next[ch];}root->isEnd = true;root->count++;}int search(string& s){Trie * root = this;for(char ch : s){if(!(root->next).count(ch)){return 0;}root = root->next[ch];}if(root->isEnd)return root->count;return 0;}
};
class WordsFrequency {Trie *t;
public:WordsFrequency(vector<string>& book) {t = new Trie();for(string& b : book)t->insert(b);}int get(string word) {return t->search(word);}
};

程序员面试金典 - 面试题 16.02. 单词频率(哈希表/Trie树)相关推荐

  1. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

  2. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  3. 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  4. 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

    1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...

  5. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...

  6. 程序员面试金典 - 面试题 01.02. 判定是否互为字符重排(哈希map)

    1. 题目 给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串. 示例 1: 输入: s1 = "abc", s2 = &qu ...

  7. 程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)

    1. 题目 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式. 例如,字符串"ca ...

  8. 程序员面试金典 - 面试题 08.02. 迷路的机器人(DFS/动态规划)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 动态规划 1. 题目 设想有个机器人坐在一个网格的左上角,网格 r 行 c 列. 机器人只能向下或向右移动,但不能走到一些被禁止的网格(有障碍 ...

  9. 程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

最新文章

  1. 08 Java程序员面试宝典视频课程之内部类
  2. vue生命周期探究(一)
  3. Adobe (Acrobat)Reader 6.0以上版本支持对有特殊权限的PDF进行添加注释,填写标单以及保存的功能。...
  4. 【2017年第4期】大数据平台的基础能力和性能测试
  5. iPhone清理喇叭灰尘_厉害了,iPhone 专用的网购商品历史最低价查询工具
  6. Eclipse常用快捷键(转载)
  7. IDEA ---- 插件
  8. AS3显示当前帧速率的类:FrameRater Class
  9. android spp协议,Android蓝牙开发SPP协议通信
  10. jquery 图像滑块_10个很棒的jQuery图像滑块插件
  11. Java开发技术有哪些?
  12. ajax,jsp,java的web应用程序(转)
  13. 打印系统开发(42)——静默打印
  14. java+mysql基于JSP0801报刊订阅系统(java,web)
  15. 20十年后的计算机作文600字,二十年后的我作文600字
  16. BZOJ 1631==USACO 2007== POJ 3268 Cow Party奶牛派对
  17. 光荣特库摩游戏《莱莎的炼金工房》宣布动画化,2023 年 7 月开播
  18. QPBOC快速借贷记流程(2)
  19. poj 1637 Sightseeing tour 混合欧拉 最大流
  20. 电脑打字拼音出现下划线,没有中文提示框

热门文章

  1. 红黑树插入时的自平衡
  2. 字符设备驱动基础篇3——字符设备驱动工作原理
  3. Linux进程全解12——lIPC机制之管道,SystemV IPC介绍
  4. shell脚本while read line的使用
  5. java线程池,信号量使用demo
  6. 第二节:Css重写样式
  7. springaop----springaop的使用(一)
  8. linux 统计命令执行后的行数或者统计目录下文件数目
  9. 简单几何(极角排序) POJ 2007 Scrambled Polygon
  10. [转载] 湖北:星空团队——海燕计划