目录
题目介绍:
题解1:(自己写的暴力解法:时间复杂度 O ( N 2 ) O(N^2) O(N2))
思路:建立临时列表,存储不重复的连续字符,作为移动窗口。判断下一项是否为重复项,不是的话,将不重复项加入到临时列表(扩大移动窗口);是的话,找到临时表中重复项的下标,根据下标 sign 重新设置临时列表(移动窗口)为 临时列表[sign+1 : ] 。然后更新 临时列表长度值(count) , 更新 max 值。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
temp = [] # 临时列表,存储不重复的连续字符
n = len(s)
if n==0: # 如果长度为0 ,返回0 ,程序结束
return 0
temp.append(s[0]) # 第一个值一定是不重复的
max = count = 1
for j in range(1,n):
if s[j] not in temp: # 遇到非重复项加到temp中,长度+1
temp.append(s[j])
else:
sign = temp.index(s[j]) # 获取重复元素的下标
temp = temp[sign+1:] # 移动窗口,将重复元素排除在外
temp.append(s[j]) # 将重复值加入temp
# 更新count值
count = len(temp)
# 更新max值
if count > max:
max = count
return max
题解2*:(官方解法:时间复杂度 O ( N ) O(N) O(N))
重点:关于使用 not in 的时间复杂度分析:
取决于本身的存储结构,如果是集合,字典的话,使用哈希散列表存储的,使用not in 判断,时间复杂度只有O(1), 要是用列表做 not in 判断,时间复杂度 就还是 O(N) ; 所以官方题解还是很值得学习的。
思路:依次遍历字符串的元素,计算以该元素为首元素的最长不重复序列的长度。用临时变量保存当前最大长度,遍历完之后返回最大长度即可。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断地移动右指针
occ.add(s[rk + 1])
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans
题解三*:动态规划思想解(待补充)
在这里插入代码片