leetcode題----尋找字符串中無重複字符串的最長字串----滑動窗口法

尋找字符串中最大的無重複字符串長度:

思路:
這道題主要用到思路是:滑動窗口

什麼是滑動窗口?

其實就是一個隊列,比如字符串中的 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列表中所有字符的長度,取最大長度的字符串即可。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章