LeetCode刷题——3. 无重复字符的最长子串

题目

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

LeetCode刷题——3. 无重复字符的最长子串

优化

虽然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


LeetCode刷题——3. 无重复字符的最长子串

上一篇:Shortest and Longest LIS CodeForces - 1304D


下一篇:[CF632D] Longest Subsequence - 埃氏筛