1. 程式人生 > >LeetCode千題斬之3:Longest Substring Without Repeating Characters(最長不重複子串)

LeetCode千題斬之3:Longest Substring Without Repeating Characters(最長不重複子串)

題目:Given a string, find the length of the longest substring without repeating characters.

先說說思路,優化的方法在於用一個滑動的視窗[i,j]瀏覽字串,先把遇到的字元加入一個字典dic,字元為key,value為最近更新的位置。如果是s[j]存在於是現有的視窗是s[j′]中,則可以跳過i到j′的字串。細節註釋見程式碼。 

#!/usr/bin/env python
# encoding: utf-8
'''
@author: cc
'''
def lengthOfLongestSubstring(s):
    """
    :type s: str
    :rtype: int
    """
    dic={}  #key為字元,value為最近更新的位置,存放已經遇到過的字元
    i=0
    j=0  # i,j之間的字串是現在瀏覽的未重複的子串
    maxlen=0
    for j in range(len(s)):
        if s[j] in dic.keys():
            i=max(i,dic[s[j]])      #一、新遇到的字元在現在i,j之間的字串中,;二、未在i,j之中,但在i之前遇到的
        dic[s[j]]=j+1  #把遇到的字元放入字典中,存在則更新位置
                        #加一是因為若新遇到的字元在現在i,j之間的字串中,則需要更新為之前位置加一;而第二種情況則保持i不變
        maxlen=max(maxlen,j-i+1)
    return maxlen