提交至leetcode的代码
class Solution(object):
def __init__(self):
self.data = [None] * 95
self.position = [None] * 95
self.result = 0
def h(self, key):
return ord(key) - 32
def insert(self, val, k):
p = self.h(val) # 计算哈希值
if len(list(filter(None, self.data))) == 95:
return 95
if k >= 95:
k = k % 94
if not self.data[p]: # 若data为空
self.data[p] = (val, k) # 将元素与其序号k放在第p个位置上
self.position[k] = (k, p) # 此元素是第k个元素,哈希值为p
if self == 0:
self.result += 1
else:
self.result = max(self.result, len(list(filter(None, self.position)))) # 已有元素个数与result之间取较大值
# print(self.data[p], len(list(filter(None, self.position))), self.result)
else:
self.result = max(self.result, len(list(filter(None, self.position))))
# print('', k)
# print(' ', self.data[p])
x = self.data[p][1]
while x >= 0 :
if k > x:
if self.position[-1] is None:
self.position[x] = None
x -= 1
else:
self.position[x] = None
self.position[x:] = [None for _ in range(x,95)]
x -= 1
else:
if x == k:
break
self.position[x] = None
x -= 1
self.data[p] = (val, k)
self.position[k] = (k, p)
self.result = max(self.result, len(list(filter(None, self.position))))
# print(' ', len(list(filter(None, self.position))), self.result)
# print(self.position)
def lengthOfLongestSubstring(self, s):
if len(s) == 0 or len(s) == 1:
return len(s)
for i in range(len(s)):
self.insert(s[i], i)
# print(self.position)
# print(self.data)
return self.result
运行时间:380ms
内存消耗:13.9MB