python代码
方法一
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
c_his = {}
m = 0
thisdict = []
for i in range(len(s)):
if s[i] in c_his:
for j in c_his:
if c_his[j] < c_his[s[i]]:
thisdict.append(j)
for l in thisdict:
c_his.pop(l)
thisdict = []
c_his[s[i]] = i
for k in c_his:
l = i - c_his[k] + 1
if m < l:
m = l
return m
滑动窗口
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
p1 = 0
p2 = -1
win = []
m = 0
for i in range(len(s)):
p2 += 1
if s[p2] not in win:
win.append(s[p2])
if p2 - p1 + 1 > m:
m = p2 - p1 + 1
else:
while (s[p2] in win):
win.remove(s[p1])
p1 += 1
win.append(s[p2])
return m
总结
1、方法一思路:遍历字符串一遍。每次循环时判断当前字符是否在新建的字典中,若存在,则计算该子字符串长度,重新记录当前字符所在位置;若不存在,则将字符和所在位置放入字典中。最后输出最长子字符串长度。
2、注意:字典在遍历过程中是无法修改或删除字典内数据的。因此方法一中,将需要删除的变量写入列表中,在遍历列表的过程中,逐个删除字典中的数据。
字典删除
a.pop(key)
3、方法二中使用了滑动窗口的方法,两个指针分别指向字符串的两端,判断两指针中间的内容是否符合需要,然后再进行指针移动。
列表添加、删除
win.append(a) # 添加变量a
win.remove(a) # 删除单个元素,删除首个符合条件的元素,按值删除
win.pop(1) # 删除单个或多个元素,按位删除(根据索引删除)
del str[1] # 根据索引(元素所在位置)来删除
del str[2:4] # 删除从第2个元素开始,到第4个为止的元素(但是不包括尾部元素)
del str # 删除整个数据对象(列表、集合等)
注意:del是删除引用(变量)而不是删除对象(数据),对象由自动垃圾回收机制(GC)删除。