算法题每日一练:无重复字符的最长子串

一、问题描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
题目链接:无重复字符的最长子串。
二、题目要求
样例 1
复制代码
样例 2
复制代码
考察
复制代码
三、问题分析
拿到这一题,首先确定属于字符串的应用,以样例 1 为例,我一开始的思路是:
从字符串逐个开始遍历,依次向后寻找以当前字符作为首位的最大子串。
复制代码
我一开始的想法是哈希表(C++的 map 计数),如果当前这个字符前面的哈希表里面没有出现,那么字符串长度+1,这个字符哈希表+1。按照上面的步骤,逐步遍历。

但是这种算法效率也太差了,我们优化一下。

其实可以把原来的二层循环简化到一层,l r 作为双指针分别指向第一个字符,依次向后遍历。
如果 r 指向字符没出现,将它后一位的下标加入哈希表中,l 不变,r++。
如果 r 指向字符出现,l 需要变成上一个出现的字符后一位,这样可以保障[l,r]区间内不存在重复的字符。
可以依照力扣上面的几张图示,帮助理解。
四、编码实现
1.优化前
复制代码
2.优化后
复制代码
五、测试结果

从 964ms->12ms,不优化了,满足了。
版权声明: 本文为 InfoQ 作者【知心宝贝】的原创文章。
原文链接:【http://xie.infoq.cn/article/d81a82c5d763c4d9bd5a06728】。文章转载请联系作者。
评论