3.无重复字符的最长子串

简称

left:左边界,right:右边界,maxLen:最长子串长度,cur:当前子串,curLen:当前子串长度

我的解法

利用right,向后时如果存在重复字符,更新maxLen和cur。最后返回maxLen和curLen中较大的一个。
用dict记录字符和索引,更新cur相当于把值小于重复字符索引的元素删除,字典长度就是curLen。

官方解法

滑动窗口,双指针,每次将left+1,查找以left指向字符为起点的子串。(本质枚举)

我的解法接近于评论区给出的外层扩展右边界、内层扩展左边界的方法,但是评论区用双指针可以使用set来检测重复元素,效率很高,参考改写代码后时间消耗从195ms降到15ms。
评论区同样用字典的解法,比我的想法好在不必关注其他索引,只需要关注left、重复字符位置和right,在我的解法里需要删除的元素在ta的解法里不用处理,只在后续查找到c在set内且c的索引小于left时更新一下即可(与检测到新字符的操作合并了)。

评论区有另一种优化是不使用哈希,而是直接遍历cur查找是否有重复字符,在内存方面更优。

知识点

滑动窗口

posted @ 2025-02-13 12:29  知白0212  阅读(20)  评论(0)    收藏  举报