スライドウィンドウ処理文字列---LeetCode


タイトル
文字列を指定すると、重複文字が含まれていない長男の列の長さを見つけてください.
例1:
  : "abcabcbb"
  : 3 
  :               "abc",       3。

例2:
  : "bbbbb"
  : 1
  :               "b",       1。

ソース:スナップ
問題を解く構想.
最初の考えはこうでした
1.遍歴2.各文字をlistに加える前に、重複があるか否かを判断する.なしでappend、更新長さ4.ある場合はリストの長さを求める、現在の長さより大きい場合は更新し、重複文字のリスト内の下付き文字を探し出し、下付き文字からリストをスライス5.この重複文字列を追加し、ループを続行します.
listのindexメソッドを使用すると,文字がlistにないとValueErrorが放出されるので,例外処理モジュールtry exceptを使用することを考えた.コードは貼らないで、効率はあまりにも悪くて、我慢しにくいで、また別の方法を見つけて、ウィンドウをスライドして、KMPの構想と少し似ているようで、しかしKMPよりずっと簡単で、以下のようです
1.文字列2を巡回する.ウィンドウ文字列の左右境界3を維持する.現在の文字がウィンドウ文字列に存在するかどうかを判断し、存在する場合は、ウィンドウの左境界を右にスライドします.すなわち、左境界+1で、ウィンドウの右境界は現在の文字です.
python実装
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        if not s:
            return 0
        #  set         ,      o(1)
        s1 = set()
        #       ,        ,     
        cur_len, max_len, left = 0, 0, 0   
        n = len(s)
        for i in range(n):
            cur_len += 1	
            #           
            #    if,    ,      'abbbc',                    ,        ,         
            while s[i] in s1:
                s1.remove(s[left])	#        ,      
                left += 1	#    
                cur_len -= 1
            if cur_len > max_len:
                max_len = cur_len
            s1.add(s[i])
        return max_len