尋找字符串中最大的無重複字符串長度:
思路:
這道題主要用到思路是:滑動窗口
什麼是滑動窗口?
其實就是一個隊列,比如字符串中的 abcabcbb,進入這個隊列(窗口)爲 abc 滿足題目要求,當再進入 a,隊列變成了 abca,這時候不滿足要求。所以,我們要移動這個隊列!
如何移動?
我們只要把隊列的左邊的元素移出就行了,直到滿足題目要求!
一直維持這樣的隊列,找出隊列出現最長的長度時候,求出解!
s = "aakabcwweddf"
def findMaxLen(s):
if not s: return 0
left = 0
lookup = set()
n = len(s)
max_len = 0
cur_len = 0
for i in range(n):
cur_len += 1
while s[i] in lookup:
lookup.remove(s[left])
left += 1
cur_len -= 1
if cur_len > max_len: max_len = cur_len
lookup.add(s[i])
print(max_len)
return max_len
findMaxLen(s) # 輸出: 5
尋找字符串中無重複的最長字符串:
s = "aabcddefgggopi"
def findStrings(s):
max_len = 0
cl = []
result=[]
for i in range(len(s)):
if s[i] in cl:
if cl[0] == s[i]:
current_len = len(cl)
if current_len > max_len:
max_len = current_len
result.append(list(cl))
cl.pop(0)
#cl.clear()
elif cl[-1] == s[i]:
current_len = len(cl)
if current_len > max_len:
max_len = current_len
result.append(list(cl))
cl.clear()
cl.append(s[i])
final_result = []
for res in result:
if len(res) == max_len:
final_result.append(res)
print(final_result) #輸出:[['a', 'b', 'c', 'd'], ['d', 'e', 'f', 'g']]
具體思路:
遍歷字符串中所有字符,逐個字符加入到 cl列表
cl 列表記錄當前的字符串,如當前cl列表中字符串爲 [a,b,c]
現在分兩種情況:
1.若下一個進入cl列表的字符串與cl的最左邊的字符(即a)相同:
則 cl中把最左邊的字符(即a)從cl中刪除
2.若下一個進入cl列表的字符串與cl的最右邊的字符(即c)相同:
則先把當前cl的字符串(即a,b,c)加入到result列表中,作爲保存結果,然後把cl列表清空。
遍歷完所有字符後,result列表裏裝的就是 s字符串中所有連續不重複的子字符串。
最後求出result列表中所有字符的長度,取最大長度的字符串即可。