Add and Search Word - leetcode 221号题目个人题解
来源:互联网 发布:unity3d 导入人物模型 编辑:程序博客网 时间:2024/06/02 13:40
Add and Search Word - leetcode 221号题目个人题解
题目要求
Design a data structure that supports the following two operations:
void addWord(word) bool search(word)
search(word) can search a literal word or a regular expression string containing only letters a-z
or .
. A .
means it can represent any one letter.
For example:
addWord("bad")addWord("dad")addWord("mad")search("pad") -> falsesearch("bad") -> truesearch(".ad") -> truesearch("b..") -> true
解题思路
这是一道Medium难度的题
题目要我们建立一个数据结构,称为WordDictionary,它有两个功能。
要能够实现能向其中添加词语
能够进行查找。输入一个词语,其中的任何字母可以用
.
符号来代替,如果在WordDictionary中有这个词语的话,就返回true
,否则返回false
。
那么,由此看来这个问题主要应该是一个字符串模式匹配的问题。
首先,我们可以建立一个元素为字符串的向量来存储单词。
然后,每次新增添一个单词,就把它push到这个向量里。
最后,只要写一个字符串匹配的函数,用来搜索字符串就好了。当然,按照题目的要求,这个匹配函数要把目标单词中的.
都当成是匹配的。
详细代码
按照这个思路,很快便可以把代码写出来了:
#include<vector>#include<string>using namespace std;bool scomp(string main,string temp){ if(main.length()!=temp.length()) return false; for(int i = 0;i<(int)temp.length();i++){ if(temp[i]!=main[i]&&temp[i]!='.') return false; } return true;}class WordDictionary {private: vector<string> cont;public: void addWord(string word) { cont.push_back(word); } bool search(string word) { int num = (int)cont.size(); for(int i = 0;i<num;i++){ if(scomp(cont[i],word)) return true; } return false; }};
调试之后,进行提交,跑过了几个测试,就出现问题了。
超时了!!
在跑最后一个测试样例的时候,要进行非常多次查询,进行线性搜索的话非常耗时间!本来想,可以建立一个字典树,这样应该可以减少查询的时间可是碍于.
符号的存在,无法建立字典树。这就非常尴尬了。
思路改进
那么还有什么办法可以减少查询时间呢?稍加思考,我们不难发现,就算用.
号来取代单词中的任何字母,单词的总长度是不变的。那么我们在存储单词的时候,把同样长度的单词放在一起,查询的时候只在同样长度的单词里面查找,不就更快了嘛!
说走咱就走,把储存单词用的向量改成向量组vector<string> cont[3000];
。把长度为 i 的单词存在cont[i]
中,每次查找在对应向量里面查找就ok了。
详细代码如下:
#include<vector>#include<string>using namespace std;bool scomp(string main,string temp){ if(main.length()!=temp.length()) return false; for(int i = 0;i<(int)temp.length();i++){ if(temp[i]!=main[i]&&temp[i]!='.') return false; } return true;}class WordDictionary {private: vector<string> cont[3000];public: void addWord(string word) { int len = (int)word.length(); cont[len].push_back(word); } bool search(string word) { int len = (int)word.length(); int num = (int)cont[len].size(); for(int i = 0;i<num;i++){ if(scomp(cont[len][i],word)) return true; } return false; } };
这一次,不仅顺利通过测试,还超过了所有本题的提交者。想想用这么简单的办法实现了这效率,心里还有点小激动。
结语
有的时候,简单的办法,也可以是好办法。
(完)
- Add and Search Word - leetcode 221号题目个人题解
- [LeetCode] Add and Search Word
- leetcode--Add and Search Word
- Leetcode 211 Add and Search Word
- Leetcode 211. Add and Search Word
- LeetCode 211 Add and Search Word
- 20170602-leetcode-211-Add and Search Word
- [Leetcode] 211. Add and Search Word
- [leetcode]211. Add and Search Word
- leetcode 211. Add and Search Word
- leetcode 211. Add and Search Word
- leetcode 211. Add and Search Word
- LeetCode 题解(123): Add and Search Word - Data structure design
- add-and-search-word
- Add and Search Word
- Add and Search Word
- Add and Search Word
- LeetCode题解:Word Search
- Eclipse下使用Maven整合SSM(spring springmvc mybatis)
- windows7 windows update 一直 正在检查更新
- 【React Native 热部署】插件 react-native-pushy
- linux下帮助使用方法 -- help/man/info
- php中书写一个创建多久目录的函数
- Add and Search Word - leetcode 221号题目个人题解
- R Exploratory Data Analysis探索性数据分析基础部分
- Smarty特点
- Python-黑客-004 用Python构建一个SSH僵尸网络-02 手动与SSH交互
- 本人项目介绍
- php无限级分类
- java中的基本数据类型?各占多少位?多少字节?取值范围?
- 欢迎使用CSDN-markdown编辑器
- 反转单链表的几种方法