题目描述:
实现一个 Trie (前缀树),包含insert,search, 和startsWith这三个操作。
示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true
说明:
你可以假设所有的输入都是由小写字母a-z构成的。
保证所有输入均为非空字符串。
知识点:
思路和代码:
这个代码有问题
自己测试代码感觉没啥问题,但是leetcode上提交报错不知为啥,如果有幸被大佬看到,欢迎指正
class TrieNode:
"""
Trie节点
"""
def __init__(self):
self.link_dict=dict()
self.is_end=False
def put(self,c): # 向链接集中加入新的链接节点
self.link_dict[c]=TrieNode()
def contain(self,c):
return c in self.link_dict
class Trie:
def __init__(self):
self.root=TrieNode()
def insert(self,s):
curr_root=self.root
flag = False
s_length = len(s)
for i in range(s_length):
if curr_root.contain(s[i]):
if i < s_length - 1:
curr_root = curr_root.link_dict[s[i]]
else:
curr_root.put(s[i])
if i < s_length - 1:
curr_root = curr_root.link_dict[s[i]]
curr_root.is_end=True
def search(self,s):
curr_root = self.root
s_length=len(s)
for i in range(s_length):
if curr_root.contain(s[i]): # 存在该字符链接节点
if i<s_length-1:
curr_root = curr_root.link_dict[s[i]]
else: # 判断最后一个字符链接节点是否为end
if curr_root.is_end:
return True
else:
return False
else:
return False
def startswith(self,s):
curr_root = self.root
for c in s:
if curr_root.contain(c): # 只判断是否存在该字符链接节点
curr_root = curr_root.link_dict[c]
else: # 无链接直接返回False
return False
return True # 遍历完成后返回True