关于leetcode 211 用C++实现超时的问题
来源:10-5 Trie字典树和简单的模式匹配
Inuyasha__
2019-03-30
leetcode 211 我用老师的思路用C++的代码实现了一下 leetcode 211
好像 C++ STL 中的map是用红黑树的 unordered_map 是用哈希表实现的
两个都用了一下,均在最后一个测试样例中超时,希望老师能看一下,
哪里还可以优化的。
代码如下,这个是 unordered_map 的代码
class WordDictionary {
private:
class Node {
public:
bool isWord;
unordered_map<char, Node*> next;
public:
Node(bool isWord)
{
this->isWord = isWord;
}
Node()
{
isWord = false;
}
};
public:
/** Initialize your data structure here. */
WordDictionary() {
root = new Node();
}
/** Adds a word into the data structure. */
void addWord(string word) {
addWord(root, word, 0);
}
/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */
bool search(string word) {
return search(root, word, 0);
}
private:
void addWord(Node* node, string word, int index)
{
if (word.length() == index)
{
node->isWord = true;
return;
}
char c = word[index];
if (node->next.find(c) == node->next.end())
{
node->next[c] = new Node();
}
addWord(node->next[c], word, index + 1);
}
bool search(Node* node, string word, int index)
{
if (word.length() == index)
{
return node->isWord;
}
char c = word[index];
if (c != '.')
{
if (node->next.find(c) == node->next.end())
return false;
return search(node->next[c], word, index + 1);
}
else
{
unordered_map<char, Node*>::iterator iter;
for (iter = node->next.begin(); iter != node->next.end(); iter++)
{
if (search((*iter).second, word, index + 1))
return true;
}
return false;
}
}
Node* root;
};
/**
* Your WordDictionary object will be instantiated and called as such:
* WordDictionary* obj = new WordDictionary();
* obj->addWord(word);
* bool param_2 = obj->search(word);
*/
写回答
1回答
-
liuyubobobo
2019-03-30
我没有细看代码。猛地看,很有可能是因为添加过程不断地使用new造成的超时。
我的实现使用一个数组来存储所有的节点。所以,next可以不指向一个Node*,而是int,这个int表示下一个节点在数组中的索引。
加油!:)
112019-03-30
相似问题