3. 無重複字元的最長子串

GreenPill發表於2020-11-11

3. 無重複字元的最長子串

題目

給定一個字串,請你找出其中不含有重複字元的 最長子串 的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

解法1–爬動視窗(因為沒有滑動起來)

用set儲存已經用過的字元,每當新進來的字元是已經存在了的,就重置起點,重置set,重新開始.
因為沒有滑動視窗的流暢,就暫時叫做爬動視窗吧.
在這裡插入圖片描述

def lengthOfLongestSubstring(s: str) -> int:
    max_len = start = end = 0
    value_set = set()
    while end < len(s):
        if s[end] in value_set:
            start += 1
            end = start
            value_set.clear()
        value_set.add(s[end])
        end += 1
        target = end-start
        if target > max_len:
            max_len = target
    return max_len

解法2–滑動視窗(因為沒有滑動起來)

因為發生重複時不需要收縮視窗大小為0,只需要到達沒有重複的狀態就行了,所以可以把起始位置逐步前移,直到沒有重複元素.
在這裡插入圖片描述

def lengthOfLongestSubstring2(s: str) -> int:
    max_len = start = end = 0
    value_set = set()
    while end < len(s):
        if s[end] in value_set:
            value_set.remove(s[start])
            start += 1
            continue
        value_set.add(s[end])
        end += 1
        target = end-start
        if target > max_len:
            max_len = target
    return max_len

Python學到了

11.python的set

集合(set)是一個無序的不重複元素序列。
可以使用大括號 { } 或者 set() 函式建立集合,注意:建立一個空集合必須用 set() 而不是 { },因為 { } 是用來建立一個空字典。
set的底層是通過雜湊表實現的.
判斷元素是否在表中一是看hash值是否已存在,二是看兩個值是否真的相等.

在這裡插入圖片描述

相關文章