Leetcode3. 无重复字符的最长子串 Python实现

  • 题目要求:

image.png

  • 思路数组

    • 用一个字典来存数组元素的index
    • 记录一个start,用来表示当前的不重复的字符串的起点
    • 定义mymax,保存当前遍历过的最长的字符串的长度
    • 遍历数组,若是元素i不在字典中,说明当前没有出现重复的字符,若是i的下标-start大于mymax,也就是当前不重复的字符串的长度大于保存的最长的长度,更新mymax的值,若是元素i在字典中,说明前面已经有重复的元素,把字典中mymax[i]的值赋给start,更新mymax[i]为当前的下标。好比字符串abhwb,遍历到第二个b时,当前不重复的字符串是从上一次出现的b的下一位到当前的b,因此要先把mymax[i]的值赋给start。
  • 核心代码:
mydict = {}
mymax = 0
# start从-1开始是由于有一个特殊的测试用例" ",须要返回的值是1
start = -1

for i in range(len(s)):
    # 若是遍历到的元素在字典中,说明重复出现了,并且若是这个值上一次出现的位置在start后面,start须要更新
    if s[i] in mydict and mydict[s[i]] > start:
        #字典中旧的值赋给start,即上一次该元素出现的位置,更新字典中这个元素当前的位置
        start , mydict[s[i]] = mydict[s[i]] , i  
    else:
        #若是不在字典中,把这个值加到字典里,value为该元素的下标
        mydict[s[i]] = i
        # i - start为当前无重复的字符串的长度,若是这个长度比记录的最长的值mymax还大,更新mymax
        if i - start > mymax:
            mymax = i - start

return mymax
  • 完整代码:
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        mydict = {}
        mymax = 0
        start = -1

        for i in range(len(s)):
            if s[i] in mydict and mydict[s[i]] > start:
                start , mydict[s[i]] = mydict[s[i]] , i  
            else:
                mydict[s[i]] = i
                if i - start > mymax:
                    mymax = i - start

        return mymax
相关文章
相关标签/搜索