【Leetcode】无重复字符的最长子串

1 题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

2 分析

题目要求寻找无重复字符的最长子串,首先无重复字符的最快查找方法是字典或者set,其次计算子串长度的最快方式是终点位置减起始点位置,因此字典记录每个字符的位置是最好的结构。但光有字符位置字典还不够,我们无法记录子串的起始点和终点分别是哪个字符,因此需要两个指针left、right进行记录。

有了以上大致方案,可以写一个循环,当遇到字符不在字典中,则进行记录,右指针右移;当遇到字符在字典中,意味着发生冲突了,需要更新子串长度并将left指针移动到不会重复的位置。这里有个关键点,是不是只要字典中有相同字符,left指针就要移动?其实不是的:例如对s = "abba"而言,当遍历到第二个b的时候,left指针已经移动到位置2了,即使dict'a'=0。那么当遍历到第二个a的时候,即使dict'a'已经存在,但因为dict'a'<left,left是不需要更新的。

3 代码

python 复制代码
def lengthOfLongestSubstring(self, s):
    """
    :type s: str
    :rtype: int
    """
    # 用两个指针记录子串的起始点和结束点,即可以计算出子串的长度
    # 用字典记录每个字符的位置,就可以判断是否有重复
    # 当字符已经在字典中出现的时候,如果要将当前字符加入子串中,要求left指针移动到该字符不存在的地方。
    pos_dict = {}
    left, right = 0,0
    longest = 0
    for right, char in enumerate(s):
        if s[right] in pos_dict:
            left = max(left, pos_dict[char]+1)
        pos_dict[char] = right
        longest = max(longest, right-left+1)
    return longest
相关推荐
Jerry6 分钟前
LeetCode 739. 每日温度
算法
2601_954526755 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
叩码以求索6 小时前
浅谈:算法萌新如何高效刷题应对面试(一)
算法·面试·职场和发展
谙弆悕博士6 小时前
信息系统项目管理师教程(第4版)笔记——第 2 章 信息技术发展
笔记·职场和发展·软考高级·软考·高项·项目经理
c238567 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
aaaameliaaa8 小时前
指针之总结
c语言·笔记·算法
宵时待雨8 小时前
优选算法专题9:哈希表
数据结构·算法·散列表
txzrxz8 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
gwf2169 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
noipp9 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu