計算不含重複字元的最長子串的長度 演算法

2021-08-28 10:15:09 字數 1634 閱讀 4420

given a string, find the length of the longest substring without repeating characters.

給出乙個字串,計算沒有重複字元的最長子串的長度。

example 1:

input: "abcabcbb"

output: 3

explanation: the answer is "abc", with the length of 3.

example 2:

input: "bbbbb"

output: 1

explanation: the answer is "b", with the length of 1.

example 3:

input: "pwwkew"

output: 3

explanation: the answer is "wke", with the length of 3.

note that the answer must be a substring, "pwke" is a subsequence and not a substring.

從左向右掃瞄,如果下一字元在之前沒有出現過,則繼續下去,直到乙個重複字元的出現,計算到這裡之前的子串的長度,然後繼續從該位置向右掃瞄,繼續尋找是否有更長的符合條件的子串,但是下一子串的開頭就必須從剛才那個重複字元出現過的位置的下一位置開始。

比如abcad,一開始依次掃瞄abc,然後到a的時候發現重複了,於是計算當前子串abc長度為3,繼續剛才的掃瞄,下一字元是d,然後結束;因為第一次的時候a是重複字元,所以計算第二個子串長度時應該從b開始,即bcad,長度為4,比剛才的3更長,所以最終結果為4。

想法是這樣,但是怎麼實現也是個問題。判斷字元是否出現過,可以用乙個128位(或256位)的陣列num,字元可以對應ascii中的0~127,陣列相應位置的元素用來標識是否出現過,比如可以用num[『a』]=1表示其已經出現過。但是這樣會帶來問題,就是如何在識別下乙個子串時恢復所有字元的狀態,還有如何計算子串的長度。

一種方式是陣列對應元素記錄該字元在子串中的位置,並在每次遇到乙個新子串時記錄長度,並更新位置。

**如下:

class

solution

;int len =0;

int maxlen =0;

for(

auto i : s)}}

len++

; num[i]

= len;

}return maxlen >= len ? maxlen : len;}}

;

上述的方法需要在每次遇到新子串都更新一遍陣列,這樣很影響效能,乙個好的改進就是陣列記錄對應字元最近出現的位置,並用乙個變數substart記錄子串開始位置,若字元最近出現的位置在substart的右邊,說明已經重複。

**如下:

class solution ; // 記錄最近下標的下一位置 

for(int i = 0, substart = 0; i < s.size(); i++)

return maxlen;

}};

不含重複字元的最長子串

問題描述 給定乙個字串,找到最長的不含重複字元子串。例如,abcabccc 最長不含重複字元的子串為 abc 長度為3。對於 bbbbb 最長的子串為 b 長度為1。解決思路 滑動視窗 維護乙個不包含重複字元 視窗 從左到右掃瞄字串,每當加乙個新字元時,檢查該字元是否存在於 視窗 中,如果不存在則將...

不含有重複字元的最長子串

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

python求解不含重複字元的最長子串

解題思路 該題類似於乘積最大,加和最大的連續陣列,本題也使用於連續並且也使用滑動視窗來做,滑動視窗做法是維護兩個指標,i和j,它們什麼時候增加視窗,什麼時候打破視窗。法一,使用while迴圈。def lengthlongestsubstring s 使用set來放入不重複的子串 usedchar s...