Algorithem_Depth-First Search
3. Longest Substring Without Repeating Characters
Given a string s, find the length of the longest substring without repeating characters.
Example 1:
1 | Input: s = "abcabcbb" |
Example 2:
1 | Input: s = "bbbbb" |
Example 3:
1 | Input: s = "pwwkew" |
解法一
这道题的题目刚开始仔细看,看下面的例子1和2,以为要找的是重复字符串的长度,再后来以为是不重复字符串的长度,最后才看明白,要找的是,最长的子字符串里不包含有重复字符的长度。
题目看懂之后,想到的解法是最直观的,从左到右开始遍历字符串,设定一个默认长度1,然后依次往后取,如果取到的元素和包含在前面的元素中,则停止取,获取前面已经取到的元素的长度,然后遍历下一个字符串。可以想成,从第一个字符开始,有一个框框,框框的长度的从0开始慢慢增加,如果要增加的元素包含在框框中,则停止增加,获取先有框框的长度;然后遍历下一个字符,框框继续从1开始。
1 |
|
代码如下:
1 |
|
但这个效率有点低,嗯,是否可以优化一下
优化点:
- 获取到最长的元素之后,遍历到 count-maxLength 的元素的时候,其实就可以不用遍历了,因为从这个元素开始,最长也就是 maxLength 了。
- 获取到最长的元素之后,后续元素的遍历,框框的长度可以以 maxlength 为准,只考虑比maxlength大的情况。
1,添加判断后,执行时间比不加判断多了65ms,而内存大小一致;
2,如果后续直接已框框的长度为准的话,还要判断框框里面的元素是有重复,会更费时。
那到底要怎么优化呢?
解法二
解法二和解法一的不同在于,解法一遇到重复字符之后,就继续遍历下一个,并且把框置为0从头开始;而解法二是遇到重复字符之后,遍历移除框最左边的元素,直到没有和要添加的元素重复为止,然后继续框向后遍历
1 |
|
这里的过程可参考Longest Substring Without Repeating Characters - Leetcode 3 - Python
代码如下:
1 |
|