算法面試題03 - 最長子串

給定一個字符串 s ,請你找出其中不含有重復字符的最長子串的長度。

示例 1:

輸入:s = "abcabcbb"
輸出:3 
解釋:因為無重復字符的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入:s = "bbbbb"
輸出:1
解釋:因為無重復字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入:s = "pwwkew"
輸出:3
解釋:因為無重復字符的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。

答案

func lengthOfLongestSubstring(_ s: String) -> Int {

    var charDict = [Character: Int]()
    var maxLength = 0
    var left = 0

    for (index, char) in s.enumerated() {
        if let lastIndex = charDict[char] {
            left = max(left, lastIndex + 1)
        }
        charDict[char] = index
        maxLength = max(maxLength, index - left + 1)
    }

    return maxLength
}
print(lengthOfLongestSubstring("abcabcbb"))
print(lengthOfLongestSubstring("bbbbb"))
print(lengthOfLongestSubstring("pwwkew"))
//3
//1
//3

知識點詳解:

子串子序列的區(qū)別是:
子串:字符串中連續(xù)的字符組成的序列,比如“pwwkew”中的“wke”就是它的一個子串。
子序列:字符串中一些不一定連續(xù)的字符組成的序列,比如“pwwkew”中的“pwke”就是它的一個子序列。
子串一定是子序列,因為子串中的字符絕對是連續(xù)的。但是子序列不一定是子串,因為子序列中的字符可以不連續(xù)。

滑動窗口定義左右指針表示當前窗口范圍,右指針不斷向右滑動,根據(jù)條件收縮左指針范圍,求解最大窗口。

算法思路

  1. 使用字典來記錄每個字符最后一次出現(xiàn)的索引位置
  2. 每次嘗試擴大右邊界,檢查當前字符是否重復
    • 如果重復,移動左指針到重復字符上一次索引 + 1 的位置
    • 如果不重復,擴大窗口右邊界
  3. 不斷更新最大不重復子串長度
    雙指針形成滑動窗口是解決子串問題的常用手法之一。

算法執(zhí)行過程

0.s="abcabcbb",初始化charDict = [:]
1.index = 0, s[0] = 'a', 沒重復, left = 0, charDict = ["a": 0], maxLength = 1
2.index = 1, s[1] = 'b', 沒重復, left = 0, charDict = ["b": 1, "a": 0], maxLength = 2
3.index = 2, s[2] = 'c', 沒重復, left = 0, charDict = ["b": 1, "c": 2, "a": 0], maxLength = 3
4.index = 3, s[3] = 'a', 重復, left = 1, charDict = ["b": 1, "c": 2, "a": 3], maxLength = 3
5.index = 4, s[4] = 'b', 重復, left = 2, charDict = ["b": 4, "c": 2, "a": 3], maxLength = 3
5.index = 5, s[5] = 'c', 重復, left = 3, charDict = ["b": 4, "c": 5, "a": 3], maxLength = 3
6.index = 6, s[6] = 'b', 重復, left = 5, charDict = ["b": 6, "c": 5, "a": 3], maxLength = 3
6.index = 7, s[7] = 'b', 重復, left = 7, charDict = ["b": 7, "c": 5, "a": 3], maxLength = 3

0.s="pwwkew",初始化charDict = [:]
1.index = 0, s[0] = 'p', 沒重復, left = 0, charDict = ["p": 0], maxLength = 1
2.index = 1, s[1] = 'w', 沒重復, left = 0, charDict = ["p": 0, "w": 1], maxLength = 2
3.index = 2, s[2] = 'w', 重復, left = 2, charDict = ["p": 0, "w": 2], maxLength = 2
4.index = 3, s[3] = 'k', 沒重復, left = 2, charDict = ["p": 0, "w": 2, "k": 3], maxLength = 2
5.index = 4, s[4] = 'e', 沒重復, left = 2, charDict = ["w": 2, "k": 3, "e": 4, "p": 0], maxLength = 3
5.index = 5, s[5] = 'w', 重復, left = 3, charDict = ["w": 5, "k": 3, "e": 4, "p": 0], maxLength = 3

復雜度

時間復雜度O(n),空間復雜度O(min(m, n)),其中n是字符串長度,m是字符集大小。

BTW

感謝各位簡友的寶貴時間與意見!文章難免有疏漏或錯誤,如有涉及不當之處,還望能夠提出寶貴意見。感激不盡!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內(nèi)容