スライドウィンドウ処理文字列---LeetCode
タイトル
文字列を指定すると、重複文字が含まれていない長男の列の長さを見つけてください.
例1:
例2:
ソース:スナップ
問題を解く構想.
最初の考えはこうでした
1.遍歴2.各文字をlistに加える前に、重複があるか否かを判断する.なしでappend、更新長さ4.ある場合はリストの長さを求める、現在の長さより大きい場合は更新し、重複文字のリスト内の下付き文字を探し出し、下付き文字からリストをスライス5.この重複文字列を追加し、ループを続行します.
listのindexメソッドを使用すると,文字がlistにないとValueErrorが放出されるので,例外処理モジュールtry exceptを使用することを考えた.コードは貼らないで、効率はあまりにも悪くて、我慢しにくいで、また別の方法を見つけて、ウィンドウをスライドして、KMPの構想と少し似ているようで、しかしKMPよりずっと簡単で、以下のようです
1.文字列2を巡回する.ウィンドウ文字列の左右境界3を維持する.現在の文字がウィンドウ文字列に存在するかどうかを判断し、存在する場合は、ウィンドウの左境界を右にスライドします.すなわち、左境界+1で、ウィンドウの右境界は現在の文字です.
python実装
文字列を指定すると、重複文字が含まれていない長男の列の長さを見つけてください.
例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