无重复字符的最长子串,中等难度,leetcode地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
1.描述
给定一个字符串,请你找出其中不含有重复字符的最长子串
的长度。
示例 1:
1 | 输入: s = "abcabcbb" |
示例 2:
1 | 输入: s = "bbbbb" |
示例 3:
1 | 输入: s = "pwwkew" |
2.题解
方法一:
这道题拿到手第一感觉可以用for循环暴力解决,我们可以找出其所有子串,挨个判断是否满足条件,对于字符串abcabcbb
,它的子串无非就是:
1 | a -> ab -> abc -> abca -> abcab -> abcabc -> abcabcb |
所以理论上我们只需要2个for循环遍历所有子串,然后判断其是否包含重复字符,更新最大长度,参考代码如下:
1 | func lengthOfLongestSubstring(s string) int { |
然而,这种方法在leetcode里面没法通过验证,总是报超出时间限制,毕竟这个方法很暴力,也很烂,需要循环很多遍,时间复杂度很高,大约是N3,效率太低了。
方法二:
这道题真正考察的是滑动窗口算法,其算法的思路是这样:
1、我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」
2、我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串不符合要求(包含重复字符)
3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串符合要求,同时,每次增加 left,我们都要更新一轮结果
4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头
这种方式效率比较高,只需要遍历一遍,时间复杂度N,参考代码:
1 | func lengthOfLongestSubstring(s string) int { |