LeetCode 第 3 题:无重复字符的最长子串(Python 代码)

简介: 这是一道没有多少知识点的题目,就是用滑动窗口的方式来写,算是一道挺简单的题目,但是想了我很久。我的方法和官方的题解是差不多的,但是写完之后看官方题解就感觉很好理解。

题目 3. 无重复字符的最长子串 的描述如下:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

子串 要求一定得是连续的,而 子序列 是可以不连续的。

这是一道没有多少知识点的题目,就是用 滑动窗口 的方式来写,算是一道挺简单的题目,但是想了我很久。我的方法和官方的题解是差不多的,但是写完之后看官方题解就感觉很好理解。先说一说我自己的写法,代码如下:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        n = len(s)
        if n < 2: return n  # 字符长度为 0 和 1 的时候直接返回 n
        ans = 1  # 子串最短也有 1
        i, j = 0, 0 # 左右指针
        cache = set(s[j])  # 哈希集合记录子串里的字符
        while j < n - 1 and i <= j:
            cache.add(s[j])
            if s[j+1] not in cache:  # 如果前面一个字符不存在
                j += 1  # 那么 j 往前一格把 s[j] 包含进去
                ans = max(ans, j - i + 1)  # 更新最长子串的长度
            else:  # 如果前面一个字符存在
                if i == j: j += 1  # 如果两个指针重合了,那么都要往前走
                cache.remove(s[i]) # 移除当前的左指针字符
                i += 1  # 左指针 i 往右一步
        return ans

滑动窗口(官方题解)

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        cache = set()  # 哈希集合,记录每个字符是否出现过
        n = len(s)
        # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        rk, ans = -1, 0
        for i in range(n):
            if i != 0:
                cache.remove(s[i - 1])  # 左指针向右移动一格,移除一个字符
            while rk + 1 < n and s[rk + 1] not in cache:
                cache.add(s[rk + 1])  # 不断地移动右指针
                rk += 1
            # 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = max(ans, rk - i + 1)
        return ans

参考:LeetCode 官方题解

目录
相关文章
|
1天前
|
程序员 Python
程序员必看!Python闭包与装饰器的高级应用,让你的代码更优雅、更强大
【7月更文挑战第7天】Python中的闭包和装饰器是高级特性,用于增强代码功能。闭包是内部函数记住外部作用域的变量,常用于动态函数和函数工厂。示例展示了`make_multiplier_of`返回记住n值的`multiplier`闭包。装饰器则是接收函数并返回新函数的函数,用于不修改原函数代码就添加功能。`my_decorator`装饰器通过`@`语法应用到`say_hello`函数上,展示了在调用前后添加额外行为的能力。这两种技术能提升代码的优雅性和效率。
9 3
|
1天前
|
开发者 Python
Python元类实战:打造你的专属编程魔法,让代码随心所欲变化
【7月更文挑战第7天】Python的元类是编程的变形师,用于创建类的“类”,赋予代码在构建时的变形能力。
10 1
|
1天前
|
监控 安全 数据库
逆天改命!用自定义上下文管理器,让你的Python代码效率飙升
【7月更文挑战第7天】Python上下文管理器简化资源管理,通过自定义实现优雅控制。使用with语句自动执行资源获取和释放,确保异常安全。例如,FileContextManager类通过__enter__打开文件,__exit__关闭并处理异常。自定义上下文管理器可封装重复逻辑,增强功能如日志和监控,提升代码效率与质量。利用这一工具,代码更简洁、高效且易于维护。**
7 1
|
1天前
|
Python
Python黑魔法揭秘:闭包与装饰器的高级玩法,让你代码飞起来
【7月更文挑战第7天】Python的闭包和装饰器是提升代码效率的神器。闭包是能记住外部作用域变量的内部函数,常用于动态函数创建。示例中,`make_multiplier_of`返回一个保留`n`值的闭包。装饰器则是一个接收函数并返回新函数的函数,用于在不修改原函数情况下添加功能,如日志或性能追踪。`@my_decorator`装饰的`say_hello`函数在执行时会自动加上额外操作。掌握这两者,能让Python代码更优雅、强大。**
|
1天前
|
Python
从入门到精通,Python元类:让你的代码拥有自我进化的超能力
【7月更文挑战第7天】元类是Python中类的类,用于定义类的创建和行为。它们允许在创建类时动态修改,常用于注册、属性修改或实现单例。要使用元类,需定义继承`type`的类,重写`__new__`或`__init__`。例如,一个简单的元类能自动给新类添加属性。虽然初学者会感到挑战,但通过实践能揭示其潜力,赋予代码超凡的灵活性。**
7 0
|
1天前
|
监控 测试技术 Python
探索Python魅力:利用闭包与装饰器优化代码结构
【7月更文挑战第7天】Python中的闭包和装饰器是强大工具。闭包是能记住外部作用域变量的内部函数,常用于动态函数创建和数据封装。装饰器是接收函数并返回新函数的函数,用于在不修改原代码的情况下扩展功能,如日志或性能监控。通过示例展示了如何使用它们优化代码结构和提升效率。掌握这两者,能写出更优雅高效的Python代码。
|
2天前
|
Python
告别混乱!Python上下文管理器的自定义实践,让你的代码更加整洁有序
【7月更文挑战第6天】Python的上下文管理器通过`__enter__`和`__exit__`方法自动处理资源的获取与释放,如文件操作。使用with语句结合自定义类(如`FileManager`示例),能确保文件在使用后正确关闭,防止资源泄漏,提升代码整洁度和健壮性。自定义上下文管理器是代码模块化和错误处理的好实践。
|
2天前
|
设计模式 Python
深度揭秘!Python元类:掌握它,让你的代码拥有创造类的能力
【7月更文挑战第6天】Python元类探秘:**元类是类的类,用于控制类的创建。通过定义元类,可自定义类的行为,如动态添加方法或改变继承结构。示例中,`my_metaclass`在创建类时添加`new_method`。元类强大且适用于高级编程,如动态修改、注册类或实现设计模式。理解并善用元类能提升Python编程技巧。
7 0
|
2天前
|
数据采集 程序员 Python
深度定制Python上下文管理器,让你的代码世界从此井井有条
【7月更文挑战第6天】Python的上下文管理器简化了资源管理,通过`__enter__`和`__exit__`方法自动处理获取和释放。例如,一个自定义的LoggingContextManager类在`__enter__`中配置日志并返回记录器,在`__exit__`中关闭文件。使用`with`语句,可以优雅地控制日志文件的生命周期,提高代码的整洁性和健壮性。
6 0
|
2天前
|
Python
Python大神的秘密武器:揭秘上下文管理器的自定义艺术,让代码更优雅
【7月更文挑战第6天】Python上下文管理器是资源管理的关键,与with语句结合确保自动释放,防止资源泄露。通过定义__enter__和__exit__方法的类或使用contextmanager装饰器的生成器,可自定义管理器,简化代码,增强健壮性,如资源获取与释放、异常处理和高级功能实现。掌握这一技巧能提升代码的优雅度和可维护性。**