#利用字典实现前缀树
trie = {}
# 建立字典实现的字母前缀树
for word in words:
cur = trie
for alpha in word:
cur=cur.setdefault(alpha,{})
#配合哈希与双向链表实现O(1)的查找以及增删复杂度
class Node:
def __init__(self,key,value):
self.key=key
self.value=value
self.next=None
self.pre=None
class LRUCache:
def __init__(self, capacity: int):
self.dic=dict()
self.capacity=capacity
self.size=0
self.head=Node(-1,-1)
self.tail=Node(-1,-1)
self.head.next=self.tail
self.tail.pre=self.head
def get(self, key: int) -> int:
if(key in self.dic):
new_node = Node(key, self.dic[key].value)
# 删除旧节点
del_node = self.dic[key]
del_node.pre.next = del_node.next
del_node.next.pre = del_node.pre
# 添加新节点到头部
new_node.pre = self.head
new_node.next = self.head.next
self.head.next.pre = new_node
self.head.next = new_node
self.dic[key]=new_node
return self.dic[key].value
else:
return -1
def put(self, key: int, value: int) -> None:
new_node = Node(key, value)
# 添加新节点到头部
new_node.pre = self.head
new_node.next = self.head.next
self.head.next.pre = new_node
self.head.next = new_node
if(key in self.dic):
del_node=self.dic[key]
del_node.pre.next=del_node.next
del_node.next.pre=del_node.pre
else:
# 如果key不在链表中,才考虑删去尾元素或者更改size
if(self.size==self.capacity):
# 如果满了,要删去尾部节点
self.dic.pop(self.tail.pre.key)
self.tail.pre.pre.next=self.tail
self.tail.pre=self.tail.pre.pre
else:
self.size+=1
self.dic[key] = new_node
原文:https://www.cnblogs.com/heyjjjjj/p/13837283.html