題目描述
給定乙個字串,請你找出其中不含有重複字元的最長子串的長度。
示例 1
輸入: s = "abcabcbb"示例 2輸出: 3
解釋: 因為無重複字元的最長子串是 "abc",所以其長度為 3。
輸入: s = "bbbbb"示例 3輸出: 1
解釋: 因為無重複字元的最長子串是 "b",所以其長度為 1。
輸入: s = "pwwkew"示例 4輸出: 3
解釋: 因為無重複字元的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是乙個子串行,不是子串。
輸入: s = ""解答我們先從最簡單的方法開始,最容易想到的演算法就是暴力列舉。我們可以遍歷出這個字串當中所有的子串,之後再判斷這個子串當中有沒有出現重複的元素。如果沒有重複的元素,那麼我們就更新答案。但是這種方法的複雜度很高,下面我們進行第乙個優化。輸出: 0
思考乙個問題,在不能有重複字元的限制下,我們真的有必要列舉所有的子串嗎?
其實是沒有的,在這個規則的限制下,對於字串當中的每乙個起始位置,我們能找到的最長的合法子串必然是確定而且是唯一的。換句話說,對於乙個確切的開頭而言,我們只需要順著它一直往後遍歷,如果遇到的字串沒有出現過就繼續,如果已經出現過了,那麼當下的字串就是這個開頭對應的最佳答案。
我們用樣例舉個例子:
假設 s = abcabcbb我們從 s[0] 開始,我們遍歷 b,再遍歷 c,接著遍歷 a,a 已經出現過了,所以 abc 就是以 s[0] 開頭的最佳答案。對於 s 當中的每乙個位置,我們都可以找到它對應的區域性最佳答案。之後,我們只需要在這當中找出最大的長度即可。
我們用 python 寫出**:
class solution:這種方法的複雜度就很好算了,對於 s 而言,它一共有 n 個位置可以作為起始,每個起始位置,最多遍歷 n 次,所以整體的複雜度應該是 0(n^2)。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 如下:
從左側開始遍歷字串 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 ...