题目搬运者
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串s,找出不重复字符的最长子字符串的长度。
暴力解法
因为题目没有给出时间限制,就大胆的用了暴力解法
- 先算出字符串里,不同字符的个数 length
- 再以字符length 依次递减,遍历字符串
class Solution(object):
def is_Longestsub(self,s,left,right):
sub = []
while left<=right :
if s[left] not in sub:
sub.append(s[left])
else:
return False
left+=1
return True
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
n = len(s)
if n==0 :return 0
sub = []
for i in range(n):
if s[i] not in sub:
sub.append(s[i])
mins = 1
length= len(sub)
if length == n: return length
while length>mins:
i =0
while i+length<=n : #再这里给自己埋了个坑,写成了小于,而不是小于等于,还是要细心啊。
if Solution.is_Longestsub(self,s,i,i+length-1):
return length
i+=1
length -=1
return 1
滑动窗口解法
- 滑动窗口 设置一个hash表,依次添加不重复的字符
- 在遇到重复的字符时,只要把队列的左边的元素移出就行了
- abcabcbb 进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
- 从abcabcbb 滑动窗口收缩到了从第二个a开始的地方
def lengthOfLongestSubstring(self, s):
if not s: return 0
left = 0
right = 0
ans = 0
hashset = set()
n = len(s)
length = 0
for i in range(n):
while s[i] in hashset:
hashset.remove(s[left])
left += 1
length -= 1
hashset.add(s[i])
length += 1
if ans < length: ans = length
return ans