[Leetcode] Longest Substring Without Repeating Characters

原題:

https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

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

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", 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.

分析:

首要要判斷non-repeating characters鄙币,考慮要用字典或集合熏矿。
遍歷全部子字符串需要O(N2)锦茁,每個(gè)字符串判斷non-repeating chars需要O(n),所以最壞需要時(shí)間O(n3)和空間O(n)暴凑。但由于構(gòu)建子字符串和使用字典判斷字符獨(dú)特性可以同時(shí)進(jìn)行,所以brute force應(yīng)該只需要O(n2)艰匙。
考慮先實(shí)現(xiàn)brute force然后進(jìn)行優(yōu)化蹭越。

解題:

第一版:Brute Force

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        res = 0
        for i in range(len(s)):
            letters = set()
            j = i
            while j < len(s) and s[j] not in letters:
                letters.add(s[j])
                j += 1
            res = max(res, len(letters))
        return res

Time Limit Exceeded
時(shí)間是O(n2)拖陆,但仍不出所料的超時(shí)了弛槐。

第二版:從brute force剪枝,已經(jīng)構(gòu)建出的子字符串字典不用重復(fù)構(gòu)建依啰。使用ordered dict來(lái)實(shí)現(xiàn)一個(gè)滑動(dòng)窗口乎串,右側(cè)enqueue,左側(cè)dequeue速警。當(dāng)需要enqueue的字符已經(jīng)存在時(shí)叹誉,dequeue已存在的字符和它左邊的所有字符。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        res = 0
        letters = collections.OrderedDict()
        for letter in s:
            inserted = False
            while not inserted:
                if letter not in letters:
                    letters[letter] = 1
                    inserted = True
                    res = max(res, len(letters))
                else:
                    letters.popitem(last = False)
        return res

Runtime: 389 ms
Accepted闷旧,但是速度仍然不夠理想长豁。
使用ordered dict,在pop左側(cè)字符的時(shí)候是O(n)的時(shí)間忙灼。雖然比brute force有優(yōu)化匠襟,但總時(shí)間依然是O(n2)。

第三版:在計(jì)算子字符串長(zhǎng)度的時(shí)候该园,我們并不需要考慮每一個(gè)字符酸舍,只需要知道它的開始和結(jié)束的index就可以了。因此爬范,我們實(shí)際需要的是一個(gè)字典父腕,里面保存每一個(gè)已經(jīng)遍歷過的字符的index(重復(fù)字符取最大值)。并且在每次遇到重復(fù)字符的時(shí)候青瀑,用字典里保存的index來(lái)計(jì)算新的開始index璧亮。這樣每次遍歷結(jié)束時(shí),我們可以保證開始和當(dāng)前index之間的子字符串是沒有重復(fù)字符的斥难。

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        res = start = 0
        discovered = {}
        for idx, val in enumerate(s):
            if val in discovered:
                start = max(start, discovered[val] + 1)
            discovered[val] = idx
            res = max(res, idx - start + 1)
        return res

Runtime: 82 ms
時(shí)間:O(n)
空間:O(n)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枝嘶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哑诊,更是在濱河造成了極大的恐慌群扶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镀裤,死亡現(xiàn)場(chǎng)離奇詭異竞阐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暑劝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門骆莹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人担猛,你說我怎么就攤上這事幕垦《猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵先改,是天一觀的道長(zhǎng)疚察。 經(jīng)常有香客問我,道長(zhǎng)仇奶,這世上最難降的妖魔是什么貌嫡? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮猜嘱,結(jié)果婚禮上衅枫,老公的妹妹穿的比我還像新娘嫁艇。我一直安慰自己朗伶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布步咪。 她就那樣靜靜地躺著论皆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猾漫。 梳的紋絲不亂的頭發(fā)上点晴,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音悯周,去河邊找鬼粒督。 笑死,一個(gè)胖子當(dāng)著我的面吹牛禽翼,可吹牛的內(nèi)容都是我干的屠橄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼闰挡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锐墙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起长酗,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溪北,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后夺脾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體之拨,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年咧叭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚀乔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佳簸,死狀恐怖乙墙,靈堂內(nèi)的尸體忽然破棺而出颖变,到底是詐尸還是另有隱情,我是刑警寧澤听想,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布腥刹,位于F島的核電站,受9級(jí)特大地震影響汉买,放射性物質(zhì)發(fā)生泄漏衔峰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一蛙粘、第九天 我趴在偏房一處隱蔽的房頂上張望垫卤。 院中可真熱鬧,春花似錦出牧、人聲如沸穴肘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)评抚。三九已至,卻和暖如春伯复,著一層夾襖步出監(jiān)牢的瞬間慨代,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工啸如, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侍匙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓叮雳,卻偏偏與公主長(zhǎng)得像想暗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子债鸡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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