無重複字元的最長子串

2021-10-03 01:39:46 字數 1723 閱讀 8408

這是一道十分經典的題目,但對與我這樣乙個入門級的小白來說,做出來並理解它也花了不少的功夫啊。

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

例:輸入: 「abcabcbb」

輸出: 3

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

這道題我第一次見是在我們學校的一次考試上,當時只能想到暴力法,看網上很多人的暴力法,最多的也不過是o(n^3),

但是我當時卻寫了o(n^4),(手動哭泣)。

後來在leetcode上面又看到了這道題

(於是下決心來研究一下,終於弄個明白了。

這裡我主要介紹兩個演算法(暴力法就不說遼~)

1. 滑動視窗法

先選定start何end兩個指標(這裡的指標代表位置),均從第乙個字元開始,向後移動end,如果end和從start到end這段的子串的每乙個字元都不相同,則繼續向後移,直至出現相同或者end到達字串末尾,並隨時記錄長度。

若出現相等,(重點來了,敲黑板了),假設是位置i和end相等了,這時我們就要先將start移動到i+1的位置。

為什麼要這麼做呢,我們來想一下,這種情況會不會漏掉什麼?現在是i和end重了,現在無論我們把start放在start到i的任何乙個位置,都改變不了衝突的事實,所以我們就直接將start放在i+1的位置上來重新弄這個字串。

記錄下這個新字串的長度,然後將新串的長度與原來的長度比較,選擇下較長的那個。並繼續迴圈,最後輸出的就是最長的長度了。

基本的邏輯已經講完了,下面我們來看**和一些細節。

class

solution

} end++

; length++

;//end移位時就加乙個長度,順便也補上了特殊情況差的長度了

maxlen = maxlen > length?maxlen:length;

}return maxlen;}}

;

基本細節都再**上寫出來了。

2. 雜湊表法

雜湊表法的基本思路和方法一差不多,差別就在遍歷字串時採用了雜湊表,這樣就把遍歷的時間複雜度降到了o(1)。

實現方法是用unordered_map。

標頭檔案#include

它的key就是用雜湊表儲存的,至於雜湊表的對應關係則已經被封裝了,我們看不見,但是並不影響我們使用。

用key來儲存字元,用t來儲存字元的位置。如過位置重了,就衝突了。

下面直接上**

class

solution

hash[s[end]

]= end;

//記得實時更新雜湊表

end++

; length++

; maxlen = maxlen > length?maxlen:length;

}return maxlen;}}

;

唯一要注意的就是

hash[s[end]] >= start

這個部分,為什麼要加上這個部分呢?

舉個例子

adbcbd

第乙個衝突的是b所以start是放到b後面的位置,這時如果end到了字元d的話,沒有這一部分的話,前面已經有d了,如果不加這個判定,則d已經再雜湊表中了,會產生錯誤,所以一定要加上這一條,即在雜湊表中卻不一定在字串中。

呼~以上就是這道題的解法了,溜了溜了…

無重複字元最長子串

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

無重複字元最長子串

題目描述 給定乙個字串,找出不含有重複字元的 最長子串 的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是子串行而不是子串 i...

無重複字元的最長子串

給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行 而不是子串。int le...