[leetcode]双指针 Longest Substring Without Repeating Characters

本文深入探讨了LeetCode中“最长无重复子串”问题的解决方案,重点讲解了使用双指针构建滑动窗口的方法,以及在遇到重复字符时调整左指针的策略。通过对比不同代码实现,揭示了提升算法效率的关键改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Longest Substring Without Repeating Characters

考虑不重复的字串,主要的考点在于:

  • 是否了解指针构建字串移动窗口
  • 当出现新的重复值时怎么改变窗口left指针

其实自己一开始的想法是想着能不能记录下每次出现的位置,然后用集合取交集的思想得到一个区域差值。最后发现不可以,因为对于两端的情况很难解决。
参考网上的解法,其实只要知道用双指针来构建这个字串的滑动窗口,其实就差不多知道怎么做了。其外一个坑的地方就在于这个窗口left指针如何进行移动,不过自己画几个用例也就可以知道,如果不在滑动窗口内没事,如果在窗口内那么left指针要移动到上一个重复字符的下一个位置。
自己的代码

from collections import defaultdict
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if len(s)<1:
            return 0
        len_s=len(s)
        f=0
        end=0
        max_interval=0
        res={}
        for i in range(len_s):
            temp=s[i]
            if temp in res and res[temp]>=f:
                f=res[temp]+1
            res[temp]=i
            end+=1
            temp_interval=end-f
            max_interval=max_interval if max_interval>temp_interval else temp_interval
        return max_interval

leetcode上最快的代码:
其实改进的点也容易理解:
主要在于原代码的合并,有些过程或者变量重复处理,去掉就能变快。

  • 实际上需要改变的只是一个left指针,right指针是跟i一样的
  • 采用enumerate(),自己还在傻乎乎的取len再range
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return 0
        dic = {}
        ans = 0
        lastDup = 0
        for i, ch in enumerate(s):
            if ch in dic and lastDup <= dic[ch]:
                # print i, lastDup
                lastDup = dic[ch]+1
            else:
                # print ch, i
                ans = max(ans, i-lastDup+1)
            dic[ch] = i
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值