LeetCode刷題實戰3 無重複字元的最長子串

2022-05-08 13:30:12 字數 2816 閱讀 6078

題目描述

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

示例 1

輸入: s = "abcabcbb"

輸出: 3

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

示例 2

輸入: s = "bbbbb"

輸出: 1

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

示例 3

輸入: s = "pwwkew"

輸出: 3

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

請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。

示例 4

輸入: s = ""

輸出: 0

解答我們先從最簡單的方法開始,最容易想到的演算法就是暴力列舉。我們可以遍歷出這個字串當中所有的子串,之後再判斷這個子串當中有沒有出現重複的元素。如果沒有重複的元素,那麼我們就更新答案。但是這種方法的複雜度很高,下面我們進行第乙個優化。

思考乙個問題,在不能有重複字元的限制下,我們真的有必要列舉所有的子串嗎?

其實是沒有的,在這個規則的限制下,對於字串當中的每乙個起始位置,我們能找到的最長的合法子串必然是確定而且是唯一的。換句話說,對於乙個確切的開頭而言,我們只需要順著它一直往後遍歷,如果遇到的字串沒有出現過就繼續,如果已經出現過了,那麼當下的字串就是這個開頭對應的最佳答案。

我們用樣例舉個例子:

假設 s = abcabcbb

我們從 s[0] 開始,我們遍歷 b,再遍歷 c,接著遍歷 a,a 已經出現過了,所以 abc 就是以 s[0] 開頭的最佳答案。對於 s 當中的每乙個位置,我們都可以找到它對應的區域性最佳答案。之後,我們只需要在這當中找出最大的長度即可。

我們用 python 寫出**:

class solution:

def lengthoflongestsubstring(self, s: str) -> int:

ret = 0

n = len(s)

if n == 1:

ret = 1

else:

for i in range(n):

char_set = set()

char_set.add(s[i])

mid_ret = 1

for j in range(i+1, n):

if s[j] in char_set:

break

else:

char_set.add(s[j])

mid_ret = mid_ret + 1

ret = max(mid_ret, ret)

return ret

這種方法的複雜度就很好算了,對於 s 而言,它一共有 n 個位置可以作為起始,每個起始位置,最多遍歷 n 次,所以整體的複雜度應該是 0(n^2)。

滑動視窗解法

假設原始字串 s 如下:

從左側開始遍歷字串 s,以 i 標記視窗左側,j 標記視窗右側,初始時,i=0,j=0,即開頭 a 所在的位置,此時,視窗大小為 1。

然後,將 j 右移,逐步擴大視窗,依次經過 b、c、d,此時,視窗內均為重複的字元,繼續右移 j。

當 j 移動到 d 後面的 a 所在位置時,對應字元 a 在視窗中已經存在,此時,視窗大小為 5,去除當前重複的一位,視窗大小為 4。此時視窗內的字串為 abcd。

找到視窗中已存在的該字元所在位置,並將 i 移動到該位置的下一位。

此時為第二個視窗。

繼續重複之前的操作,直到 j 移動到字串最後一位停止。

**實現

class solution:

def lengthoflongestsubstring(self, s: str) -> int:

if not s:

return 0

rec = list()

n = len(s)

max_len = 0

cur_len = 0

for i in range(n):

if s[i] not in rec:

cur_len += 1

else:

index = rec.index(s[i])

rec = rec[index+1:]

cur_len = len(rec)

max_len = max(max_len, cur_len)

return max_len

LeetCode 刷題 3 無重複最長子串

題目描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。測試示例 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。輸入 pwwkew 輸出 3 解釋 因為...

LeetCode刷題3無重複字元的最長子串C

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...

Leetcode刷題之路 3 無重複的最長字串

給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出 3 ...