LeetCode 3.无重复的最长子串--

2022年3月22日开始 挑战每日一题 题库不限

希望能坚持 希望广大网友监督 共勉

题目 3. 无重复字符的最长子串 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

方法简介:

1.滑动窗口:

        顾名思义,就是有一个大小可变的窗口,左右两端方向一致的向前滑动(右端固定,左端滑动;左端固定,右端滑动)

        比如对于列表[1, 2, 3, 4, 5, 6]

                              [1, 2, 3]

                                  [2, 3, 4]

                                      [3, 4, 5]

                                          [4, 5, 6]

        相当于反复执行移除第一个元素和append后一个元素的操作

        一般适用于字符串和列表类型题目,要求最值(最大长度,最短长度等等)或者子序列的情况,偶尔和哈希表一同出现

2. 哈希表:

        对于python来说是字典等,可以实现O(1)的查找和插入操作

        一般适用于快速判断一个元素是否在集合当中出现

3.思路:

        新建一个集合用于储存不重复的字符串

        获取字符串长度作为循环的次数

        右指针从-1开始移动即一开始未进入字符串,左指针从0开始直到最后一个字符(循环len次)

                当右指针所指的字符在字符串中不存在 且指针可以向右移动的时候 (while)

                        向集合添加右指针所指的字符        

                        右指针向右移动

                当结束while时

                        比较当前滑动窗口长度和之前的长度(初始值设为0)

                        储存最大的窗口长度

                        左指针向右移动

        返回 储存的最大的窗口长度

代码实现部分

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        rk, ans = -1, 0 #设置右指针 答案初始化为0
        set1 = set() # 新建集合
        for lk in range(n):
            while rk + 1 < n and s[rk + 1] not in set1: #这里记得是不在集合而不是不在字符串中
                #当右指针可以继续移动并且右指针移动后指向的字符不在字符串中
                rk += 1 #记得先给rk加一
                set1.add(s[rk])
                # 集合添加元素 右指针向右移动
            # 当循环结束 右指针不能移动(结束)或者右指针对应的下一个字符在字符串中
            ans = max(ans, rk - lk +1) # 计算当前最大窗口
            set1.remove(s[lk]) # 左指针向右移动 窗口滑动
        return ans

共勉

        

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值