美美超过管解
题目:
3. 无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
注意:
- 考虑空字符串问题
- 有重复之后要在重复的那个后面新建序列,减少时间,故需要列表储存(标准做法里用的集合捏)
标准做法:
把重复的set.remove(),a指针步进,没有重复的话,b指针一直步进
怎么感觉没有我那个快捏
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: 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
是真的!
官方:
我的:【必须记录下来】
自己的做法:【通过并超过】
没看解答,写了半小时写出来啦,中间因为字符串不太熟卡了一下
双指针yyds【这里用滑动窗口捏】
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
# 先写循环结束条件
# 双指针
# 放入集合【重大问题:有重复之后要在重复的那个后面新建序列,需要列表】
a = 0
b = 0
if s == "":
return 0
ls = s[a]
max_len = 1
while b < len(s)-1:
b += 1
if s[b] in ls:
a = ls.find(s[b]) +1+a
ls = s[a:b+1]
else:
ls = ls+s[b]
cur_len = len(ls)
if max_len < cur_len:
max_len = cur_len
return max_len