17.17. 多次搜索
题目:
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索。输出smalls中的字符串在big里出现的所有位置positions,其中positions[i]为smalls[i]出现的所有位置。
示例:
输入:
big = "mississippi"
smalls = ["is","ppi","hi","sis","i","ssippi"]
输出: [[1,4],[8],[],[3],[1,4,7,10],[5]]
提示:
0 <= len(big) <= 1000
0 <= len(smalls[i]) <= 1000
smalls的总字符数不会超过 100000。
你可以认为smalls中没有重复字符串。
所有出现的字符均为英文小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multi-search-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
看见这种前缀,大概率字典树。有几点要注意:1)原本字典树的bool值我们用int,初始值赋为-1,然后在insert时,将这个值记为当前词在small里面的index;2)search的时候,把big按位截取,并记录开始截取的点index,当search到字典树中的“单词”时,依据insert时内置的int来记录进答案。
代码:
class Solution {
public:
vector<vector<int>> multiSearch(string& big, vector<string>& small) {
res = vector<vector<int>>(small.size());
for (int i = 0; i < small.size(); i++) {
if (!small[i].empty())
insert(small[i], i);
}
for (int i = 0; i < big.size(); i++) {
string tmp = big.substr(i);
search(tmp, i);
}
return res;
}
private:
vector<vector<int>> res;
class Trie {
public:
Trie() {};
Trie* child[26] = { nullptr };
int index = -1;
};
Trie* trie = new Trie();
void insert(string &s, int index) {
Trie* tmp = trie;
for (int i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (!tmp->child[c]) {
tmp->child[c] = new Trie();
}
tmp = tmp->child[c];
}
tmp->index = index;
}
void search(string& s, int start) {
Trie* tmp = trie;
for (int i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (tmp->child[c]) {
tmp = tmp->child[c];
if (tmp->index != -1) {
res[tmp->index].push_back(start);
}
}
else {
return;
}
}
}
};
17.17. 多次搜索相关推荐
- [leetcode 面试题 17.17] -- 多次搜索,KMP与字典树
[leetcode 面试题 17.17] -- 多次搜索 题目来源 分析 KMP思路 完整代码 字典树 完整代码 题目来源 https://leetcode-cn.com/problems/multi ...
- 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换
MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...
- 解决微信H5获取SDK授权报错提示errMsg: “config:fail,Error: 系统错误,错误码:63002,invalid signature [20200908 22:17:17][]“
如果常规检查都做过可以仔细看下微信开放文档 这个里面的报错原因 如果都不是那么极有可能是(恭喜你!看样子你的H5页面日活人数还蛮多[呲牙]) 获取腾讯微信平台access_token超过每日默认上限2 ...
- 分解成质因数(如435234=251*17*17*3*2
分解成质因数(如435234=251*17*17*3*2,据说是华为笔试题) void prim(int m, int n) { if(m>n) { while(m%n != 0) n++ ...
- 03/13 17:17:57: Launching 'app' on OPPO PBEM00. Installation did not succeed. The application could
AndroidStudio连接真机测试项目时可能会报如下错误: 03/13 17:17:57: Launching 'app' on OPPO PBEM00. Installation did not ...
- LeetCode 17电话号码的字母组合(搜索)18四数之和
电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23 ...
- 程序员面试金典 - 面试题 17.17. 多次搜索(Trie树)
文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 Trie树 1. 题目 给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串, ...
- LeetCode:面试题 17.17. 多次搜索
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索.输出smalls中的字符串在big里出现的所有位置position ...
- LeetCode:17.17.多次搜索
给定一个较长字符串big和一个包含较短字符串的数组smalls,设计一个方法,根据smalls中的每一个较短字符串,对big进行搜索.输出smalls中的字符串在big里出现的所有位置position ...
最新文章
- 【青少年编程】【三级】打气球游戏
- cs106a编程方法学作业解答(3)
- abap常用系统变量
- LeetCode 491. 递增子序列(回溯+判重剪枝)
- 关于动态生成div的认识
- jQuery dataTables四种数据来源[转]-原文地址:http://xqqing79.iteye.com/blog/1219425
- 敏捷开发般若敏捷系列之三:什么是敏捷(下)(无住,不住于空,破空执,非法,非非法)...
- SqlZoo.net习题答案:Using the SELECT statement.【nobel】
- linux 中文输入鼠标跳动,解决wps for linux 中文输入法光标不跟随的问题
- php微积分难吗,两句话让你学好微积分
- Word 2019怎样自定义模板,并将自定义模板设为默认模板
- php图文编辑,ThinkPHP整合百度Ueditor编辑器的图文教程
- [GOM引擎]假人配置的脚本设置方法
- 番茄社区门店系统新增跑腿和空码功能
- 基于CAA的CATIA二次开发环境搭建全过程(亲测可用)
- Layui模板-laytpl
- #创建虚拟机器人URDF模型
- 自定义权限修改弹框_微信小程序自定义授权弹框
- Unity 实现2D地面挖洞!涂抹地形
- NBS-Predict:基于脑网络的机器学习预测
热门文章
- Qt基于QuaZIP实现文件压缩/解压(Win下)
- 用分析服务SSAS解决占比、同比和环比问题
- Bootstrap学习笔记03
- 个人目标日历定制制作小工具微信小程序源码
- 绘图仪PLT驱动格式
- centos6下使用有道云笔记
- MySQL解决方案:不能连接到MySQL服务器
- 制作光盘安装linux系统教程,在Windows上制作CentOS自动安装的光盘的教程
- 驼背矫正实在太难?看清这三点,了解驼背的成因 驼背问题也就迎刃而解
- ABLDT维护历史资产累计购置价值和累计折旧报错 ,消息号GLT2201 “未填写行项目001中平衡字段“利润中心”