思路是这样的:我们在人工选的时候,会有一个开始数的起始位置,记录从这个起始位置cstart开始,到目前i之前都是没有重复的字符的,现在我们判断i个字符是否在这个字串里面,为了判断是否在从cstart到目前的字串里面,我们需要记录从cstart到i的所有字符,但是我们只需要这个字符的索引,自然的会想到字典这个结构,如果字典dic里面没有这个字符,说明从0开始到i-1,整个字符串还没出现过这个字符,因此我们将这个字符s[i]加入字典即可,o,记得把当前计数的字符串的长度加1;如果里面有这个字符,说明整个字符串里出现过这个字符,但是我们还需要判断是否在我们计数的子串里,如果dic[s[i]] >= cstart,说明这个字符出现过,我们需要进行一定的处理。反之,说明不在我们要计数的子串里,当作不存在进行操作即可。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic = {}
cstart = 0 # 当前字符串开始的位置
maxlen = 0
nowlen = 0
# i加1操作完一步
for i in range(0, len(s)):
# 判断i是否在当前字符串
if dic.get(s[i]) == None: # 不在
dic[s[i]] = i
nowlen += 1
else:
if dic[s[i]] >= cstart: # 在
cstart = dic[s[i]] + 1
# 每次nowlen需要改变的时候将当前的值进行比较存储
if nowlen > maxlen:
maxlen = nowlen
nowlen = i - cstart + 1
dic[s[i]] = i
else: # 不在,
dic[s[i]] = i
nowlen += 1
if nowlen > maxlen:
maxlen = nowlen
return maxlen
- THE END -
最后修改:2022年8月16日
非特殊说明,本博所有文章均为博主原创。