677.键值映射
一、trie树
class TrieNode:
def __init__(self):
self.end = False # 标志该字符是否为某个单词的结尾
self.tns = [None] * 26 #记录该字符的后续字符,26个分支表示a-z,None表示无后续
self.val = 0 #记录值
class MapSum:
def __init__(self):
self.root = TrieNode()
def insert(self, key: str, val: int) -> None:
i = self.root
for s in key:
j = ord(s) - ord('a')
if i.tns[j] == None:
i.tns[j] = TrieNode()
i = i.tns[j]
i.end = True
i.val = val
def sum(self, prefix: str) -> int:
# 辅助函数,dfs遍历
def dfs(root):
# 操作外部变量
nonlocal total
if root == None:
return
if root.end:
total += root.val
for child in root.tns:
dfs(child)
# 先到达prefix结尾在Trie树的节点
i = self.root
for s in prefix:
j = ord(s) - ord('a')
if i.tns[j] == None: # 如果中间有None,说明prefix不存在于树中
return 0
i = i.tns[j]
# 全局变量统计val总和
total = 0
# 从i节点开始dfs遍历树
dfs(i)
return total
sum的dfs方法也可以用global关键字访问外部变量
def sum(self, prefix: str) -> int:
# 辅助函数,dfs遍历
def dfs(root):
# 全局变量
global total
if root == None:
return
if root.end:
total += root.val
for child in root.tns:
dfs(child)
i = self.root
for s in prefix:
j = ord(s) - ord('a')
if i.tns[j] == None:
return 0
i = i.tns[j]
# 全局变量
global total
total = 0
dfs(i)
return total
二、
class MapSum:
def __init__(self):
"""
Initialize your data structure here.
"""
self.hash = {}
def insert(self, key: str, val: int) -> None:
self.hash[key] = val
self.hash = dict(sorted(self.hash.items(), key = lambda x : x[0]))
def sum(self, prefix: str) -> int:
res = 0
hasFinded = False
for key in self.hash:
if key[ : len(prefix)] == prefix:
res += self.hash[key]
return res
最后更新于