LeetCode刷题——3. 无重复字符的最长子串
作者:互联网
题目
思路
也是通过滑动窗口的思路,固定左端,移动右端;再移动左端。
代码
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
size = len(s)
l,r = 0,-1 # [l,r]子串
longest = 0
cur = [] # 当前子串
while l < size:
if r+1 < size and s[r+1] not in cur:
cur.append(s[r+1])
r += 1
else: # 有重复字母或右端达到末尾
cur.pop(0) # 左端右移一位,继续尝试
l += 1
if r-l+1 > longest:
longest = r-l+1
return longest
优化
虽然Accept,但是耗时有点久,回顾下代码,发现问题出现了判断是否有重复元素那里。
这里可以用集合来优化,除了集合的方式。还有一种位图(bitmap,编程珠玑)的思路。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
size = len(s)
l,r = 0,-1 # [l,r]子串
bitmap = [0] * 256 # ASCII码 ,如果bitmap[5] = 1,说明ascii码为5的元素已经在集合中。
longest = 0
while l < size:
if r+1 < size and bitmap[ord(s[r+1])] == 0:
bitmap[ord(s[r+1])] = 1
r += 1
else: # 有重复字母或右端达到末尾
bitmap[ord(s[l])] = 0
l += 1
if r-l+1 > longest:
longest = r-l+1
return longest
标签:子串,cur,bitmap,longest,刷题,LeetCode,左端,size 来源: https://blog.csdn.net/yjw123456/article/details/114226390