Created
December 8, 2019 03:50
-
-
Save stoensin/708881658b413bbac43d0aa75b9e6a22 to your computer and use it in GitHub Desktop.
字典保存每个字符第一次出现的位置。叫做prefix方法吧,因为需要维护已经遍历到的前缀部分。 当right向后遍历的过程中,如果这个字符在字典中,说明这个字符在前面出现过,即这个区间已经不是题目要求的不含重复字符的区间了,因此,需要移动left。 移动left到哪里呢?有个快速的方法,那就是移动到right字符在字典中出现的位置(即s[right]在前面的位置)的下一个位置。 无论如何都会使用right更新字典,另外记录最大区间长度即为所求。 注意,left更新的时候需要保留最大(最右)的位置。举例说明: 对于abba,当right指向最后的a的时候,left指向的是字典中保留的有第一个位置的a,如果不对此进行判断的话,left会移动到第一个字符b。 left一定是向右移动的,不可能撤…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def longestsubstr(strs): | |
| left, res= 0, 0 | |
| chars = {} | |
| for right in range(len(strs)): | |
| cur= strs[right] | |
| if cur in chars: | |
| left = max(left, chars[cur] + 1) | |
| chars[cur] = right | |
| res = max(res, right - left + 1) | |
| return res | |
| ''' | |
| 遍历时,使用字典保存每个字符第一次出现的位置。叫做prefix方法吧,因为需要维护已经遍历到的前缀部分。 | |
| 当right向后遍历的过程中,如果这个字符在字典中,说明这个字符在前面出现过,即这个区间已经不是题目要求的不含重复字符的区间了,因此,需要移动left。 | |
| 移动left到哪里呢?有个快速的方法,那就是移动到right字符在字典中出现的位置(即s[right]在前面的位置)的下一个位置。 | |
| 无论如何都会使用right更新字典,另外记录最大区间长度即为所求。 | |
| 注意,left更新的时候需要保留最大(最右)的位置。举例说明: | |
| 对于abba,当right指向最后的a的时候,left指向的是字典中保留的有第一个位置的a,如果不对此进行判断的话,left会移动到第一个字符b。 | |
| left一定是向右移动的,不可能撤回到已经移动过的位置。 | |
| ''' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment