T3 无重复字符的最长子串

桌桌 2022-8-12 59 8/12

自己模拟的查找的过程,没想到第一次过就得到了比较高效的代码:

T3 无重复字符的最长子串

思路是这样的:我们在人工选的时候,会有一个开始数的起始位置,记录从这个起始位置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 -

桌桌

8月16日01:08

最后修改:2022年8月16日
0

非特殊说明,本博所有文章均为博主原创。