美美超过管解
题目:
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, 0for 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 = 0b = 0if s == "":return 0ls = s[a]max_len = 1while b < len(s)-1:b += 1if 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_lenreturn max_len