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
相關文章
相關標籤/搜索