算法面試題03 - 最長子串

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

示例 1:

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

示例 2:

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

示例 3:

輸入:s = "pwwkew"
輸出:3
解釋:因為無重復(fù)字符的最長子串是 "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ù)。

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

算法思路

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

算法執(zhí)行過程

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

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

復(fù)雜度

時間復(fù)雜度O(n)贡耽,空間復(fù)雜度O(min(m, n))衷模,其中n是字符串長度鹊汛,m是字符集大小。

BTW

感謝各位簡友的寶貴時間與意見阱冶!文章難免有疏漏或錯誤刁憋,如有涉及不當(dāng)之處,還望能夠提出寶貴意見木蹬。感激不盡至耻!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市镊叁,隨后出現(xiàn)的幾起案子尘颓,更是在濱河造成了極大的恐慌,老刑警劉巖晦譬,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疤苹,死亡現(xiàn)場離奇詭異,居然都是意外死亡敛腌,警方通過查閱死者的電腦和手機卧土,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來像樊,“玉大人尤莺,你說我怎么就攤上這事⌒坠瑁” “怎么了缝裁?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵扫皱,是天一觀的道長足绅。 經(jīng)常有香客問我,道長韩脑,這世上最難降的妖魔是什么氢妈? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮段多,結(jié)果婚禮上首量,老公的妹妹穿的比我還像新娘。我一直安慰自己进苍,他們只是感情好加缘,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著觉啊,像睡著了一般拣宏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杠人,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天勋乾,我揣著相機與錄音宋下,去河邊找鬼。 笑死辑莫,一個胖子當(dāng)著我的面吹牛学歧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播各吨,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼枝笨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了揭蜒?” 一聲冷哼從身側(cè)響起伺帘,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忌锯,沒想到半個月后伪嫁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡偶垮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年张咳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似舵。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡脚猾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砚哗,到底是詐尸還是另有隱情龙助,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布蛛芥,位于F島的核電站提鸟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仅淑。R本人自食惡果不足惜称勋,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涯竟。 院中可真熱鬧赡鲜,春花似錦、人聲如沸庐船。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筐钟。三九已至揩瞪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盗棵,已是汗流浹背壮韭。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工北发, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喷屋。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓琳拨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屯曹。 傳聞我的和親對象是個殘疾皇子狱庇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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