這是一道十分經典的題目,但對與我這樣乙個入門級的小白來說,做出來並理解它也花了不少的功夫啊。
題目:給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。
例:輸入: 「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...