无重复字符的最长字串-双指针3

python

双指针:

  • 使用两个指针表示字符串中的某个子串的左右边界。其中左指针代表着某个子串的起始位置,而右指针代表着某个字串的终止位置;
  • ​在每一步的操作中,将左指针向右移动一格,表示开始枚举下一个字符作为起始位置,然后不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串。最后记录下这个子串的长度即为答案;
class Solution:
    def lengthOfLongestSubstring(self, s):
        n = len(s)
        rk, ans = -1, 0 # rk为右指针位置,从左边第一个字符的左侧开始,ans记录无重复字符串的长度
        occ = set() # 集合用来去重
        for i in range(n): # i是左指针位置
            if i != 0:
                occ.remove(s[i-1]) 
                ''' 避免因为前面的某个字符而导致后面的字符串断开,比如abcad,
                如果第一个a不被remove,就会错过最长无重复字符串bcad '''
            while rk+1 < n and s[rk+1] not in occ: 
            # while循环后occ里的字符组成的字符串即为某个无重复字符串
                occ.add(s[rk+1])
                rk += 1
            ans = max(ans, rk-i+1)
        return ans

复杂度分析:

  • 时间复杂度:O(N),其中 NN 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。
  • 空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。

猜你喜欢

转载自blog.csdn.net/VaccyZhu/article/details/113703948