194 · 寻找单词

news/2024/12/29 8:20:19/

 

 链接:LintCode 炼码

题解:

双指针方法:

class Solution {
public:/*** @param str: the string* @param dict: the dictionary* @return: return words which  are subsequences of the string*/vector<string> findWords(string &str, vector<string> &dict) {// write your code here.std::vector<std::string> result;for (auto& q : dict) {if (valid(str, q)) {result.push_back(q);}}return result;}
private:// 双指针方法bool valid1(const std::string& p, const std::string& q) {if (p.size() <= 0) {return false;}int i = 0;int j = 0;while (i < p.size() && j < q.size()) {if (p[i] == q[j]) {++i;++j;} else {++i;}}if (j == q.size()) {return true;}return false;}
};

-二分法求解,时间复杂度O(dict中所有字符的长度*log(str字符串长度))
--将str字符对应的位置存在到ch2pos的hash表中
--遍历dict中所有的元素与str进行对比
--对比str和dict元素,使用双指针进行对比
--dict中对应字符在hash对应字符串中查找>=当前位置的地方

 

 

class Solution {
public:/*** @param str: the string* @param dict: the dictionary* @return: return words which  are subsequences of the string*/vector<string> findWords(string &str, vector<string> &dict) {// write your code here.std::unordered_map<char, std::vector<int>> ch2pos;for (int i = 0; i < str.size(); ++i) {// 存储每个字符对应的位置ch2pos[str[i]].push_back(i);}std::vector<std::string> result;// 判断是否为对应的单词for (auto& word : dict) {if (valid(ch2pos, str, word)) {// 追加结果result.push_back(word);}}return result;}
private:int find_left_index(const std::vector<int>& pos, int cur_pos) {int left = 0;int right = pos.size()-1;while (left + 1 < right) {int mid = left + (right-left)/2;if (pos[mid] == cur_pos) {left = mid;} else if (pos[mid] > cur_pos) {right = mid;} else {left = mid;}}// 求得 >= cur_pos的位置if (pos[left] >= cur_pos) {return pos[left];}if (pos[right] >= cur_pos) {return pos[right];}return -1;}bool valid(const std::unordered_map<char, std::vector<int>>& ch2pos, const std::string& p, const std::string& q) {if (p.size() <= 0) {return false;}int i = 0;int j = 0;while (i < p.size() && j < q.size()) {if (p[i] == q[j]) {++i;++j;} else {auto ite = ch2pos.find(q[j]);// 如果当前字符不存在if (ite == ch2pos.end()) {return false;}// 查找>=当前位置,该字符存在的位置int pos = find_left_index(ite->second, i);// 不存在该单词位置if (pos == -1) {return false;}/*if (p[pos] != q[j]) {return false;}*/// 更新移动下一个位置i = pos+1;++j;}}// 对比的单词到达末尾if (j == q.size()) {return true;}return false;}
};

 

 

 

 

class Solution {
public:/*** @param str: the string* @param dict: the dictionary* @return: return words which  are subsequences of the string*/vector<string> findWords(string &str, vector<string> &dict) {// write your code here.std::vector<std::string> result;if (str.size() <= 0) {return result;}// table[i][j]当前这个字符i位置开始,后面最接近的下字符j的位置是那个下标std::vector<std::vector<int>> table(str.size()+1, std::vector<int>(26, -1));for (int i = str.size() - 1; i >= 0; --i) {for (int j = 0; j < 26; ++j) {table[i][j] = table[i+1][j];if (str[i] - 'a' == j) {// 如果是他自己就是它当前的位置table[i][j] = i;}}}for (auto& q : dict) {if (valid(table, str, q)) {result.push_back(q);}}return result;}
private:bool valid(const std::vector<std::vector<int>>& table,const std::string& p, const std::string& q) {if (p.size() <= 0) {return false;}int i = 0;int j= 0;while (i < p.size() && j < q.size()) {/*if (p[i] == q[j]) {++i;++j;} else {*/// 获得字符q[j]的位置int pos = table[i][q[j]-'a'];// 不存在这个位置if (pos == -1) {return false;}// 继续往后面查找i = pos + 1;++j;//}}if (j == q.size()) {return true;}return false;}
};


http://www.ppmy.cn/news/550515.html

相关文章

【C++】一文读懂C++中的异常处理机制

文章目录 C 中的异常处理机制1.1 什么是异常&#xff1f;1.2 调用abort()1.3 返回错误码1.4 异常机制1.5 将对象用作异常类型1.6 异常规范和C111.7 栈解退1.7.1 return和throw的区别1.7.2 什么是栈解退 1.8 其他异常特性1.9 excepyion类1.9.1 stdexcept异常类1.9.2 bad_alloc异…

网络安全面试题,渗透测试面试总结

1.什么是WebShell? WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的─种命令执行环境&#xff0c;也可以将其称做为─种网页后门。黑客在入侵了─个网站后&#xff0c;通常会将这些asp或php后门文件与网站服务器WEB目录下正常的网页文件混在─起&#xff0c;然后就可…

联想小新Pad救砖(9008刷机)

小新pad系列9008救砖教程 参考文章 准确的说不是参考&#xff0c;就是把这个文章流程重新走了一遍&#xff08;因为浏览器端无法登录微信&#xff0c;只能在微信里面打开&#xff0c;怪麻烦的&#xff09; 原文链接&#xff1a; https://doc.weixin.qq.com/doc/w3_Af0Alwb2AD…

国民技术N32L40X之IAP升级BootLoader程序

1.芯片&#xff1a;N32L406CB 2.开发环境:keil5 对于单片机做IAP功能&#xff0c;首先我们要了解它的Flash大小。我们查看他的数据手册看下Flash大小。 由上图可知Flash为128k。 然后我们再看下Flash页分布。 由上图可知&#xff0c;Flash为128k&#xff0c;64页每页2k。 那…

立创开源 BGA162-809H

简介&#xff1a;bga162-rt809h底座 不需要外接电源&#xff0c;低功耗&#xff0c;可作为VGA信号发生器使用&#xff0c;方便维修。 具有智能感知功能&#xff0c;大部分芯片离线读写时&#xff0c;支持智能识别&#xff0c;随意放置的功能。 开源协议: Public Domain 发布时…

dell r620 升级idrac_R410 iDRAC6 升级

需求背景 接上一篇《Dell R410 BIOS 升级方法》 升级完R410的BIOS之后&#xff0c;第二个需求是更新远程管理的iDRAC版本。iDRAC需要服务器安装了远程管理卡才可以使用&#xff0c;然而一般现在网上买到的二手R410都是非常旧的iDRAC版本。(简单判断方法&#xff1a;管理页面是浅…

PX4IO刷写BootLoader、固件 PX4IO固件损坏修复

前两天玩坏了一个飞控的IO芯片&#xff0c;具体表现为上电后红灯一直闪或常亮&#xff0c;有以下解决办法&#xff1a; 文章目录 FMU给IO刷写重新烧写BootLoader FMU给IO刷写 先断电&#xff0c;按住安全开关&#xff0c;上电不要松手&#xff0c;蜂鸣器会嘟嘟嘟响&#xff0…

[Mac] Newifi mini路由器刷breed+Padavan固件

1. 首先&#xff0c;准备好&#xff1a;路由器、网线、Mac网线转接头 下载好恩山大神的Bootloader&#xff1a;http://www.right.com.cn/forum/thread-161906-1-1.html 以及Newifi相应的padavan固件包&#xff1a;http://www.right.com.cn/forum/thread-161324-1-1.html &am…