关于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表示下一个节点在数组中的索引。


参考代码:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0211-Add-and-Search-Word-Data-structure-design/cpp-0211/main.cpp


加油!:)

1
1
Inuyasha__
谢谢老师,回去看一下。
2019-03-30
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程