LeetCode 03 無重復(fù)字符的最長(zhǎng)子串(python3)

字符串的子串求解類問題是一整個(gè)系列的方法愿阐,正好用這道題作為我個(gè)人學(xué)習(xí)的一個(gè)總結(jié)吧微服。
作為一個(gè)沒有訓(xùn)練過特定解法的新手,能夠想到的最直觀方法應(yīng)該就是暴力求解法缨历,這個(gè)方法時(shí)間復(fù)雜度必然很高以蕴,但是好在思路清晰,也容易上手戈二,所以就先從暴力法開始吧舒裤。

題目描述:

給定一個(gè)字符串,請(qǐng)你找出其中不含有重復(fù)字符的 最長(zhǎng)子串 的長(zhǎng)度觉吭。

示例 1:

輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長(zhǎng)子串是 "abc"腾供,所以其長(zhǎng)度為 3。

示例 2

輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長(zhǎng)子串是 "b"鲜滩,所以其長(zhǎng)度為 1伴鳖。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長(zhǎng)子串是 "wke",所以其長(zhǎng)度為 3徙硅。
請(qǐng)注意榜聂,你的答案必須是 子串 的長(zhǎng)度,"pwke" 是一個(gè)子序列嗓蘑,不是子串须肆。

暴力求解法

  • 我的初始思路:
    維護(hù)一個(gè)子串sub_string匿乃,外層循環(huán)按照給定字符串s每一個(gè)字符順序掃描,并且和子串每一個(gè)字符進(jìn)行比較(這里子串掃描應(yīng)該從后往前)豌汇,一旦當(dāng)前字符在子串中找到相同的字符幢炸,那么子串就從相同字符前一個(gè)那里截?cái)啵缓蟀研伦址釉诮Y(jié)尾拒贱。每輪掃描后更新最長(zhǎng)子串的長(zhǎng)度宛徊,循環(huán)結(jié)束后返回。

  • 代碼:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        sub_string = ''
        lens = 0
        for i in range(len(s)):
            if sub_string:
                for j in range(len(sub_string)-1,-1,-1):
                    if s[i] == sub_string[j]:
                        sub_string = sub_string[j+1:]
                        break
            sub_string+=s[i]
            #print(sub_string)
            lens = max(lens, len(sub_string))
        return lens
  • 結(jié)果:
    因?yàn)閮蓪忧短籽h(huán)的使用逻澳,結(jié)果時(shí)間復(fù)雜度約為O(n^2)闸天,那么速度也是可想而知的慢……(還好沒超時(shí))

執(zhí)行用時(shí) :372 ms, 在所有 python3 提交中擊敗了13.76%的用戶

我這個(gè)速度是注定要被人嘲笑的(還好我臉皮厚),接下來就是進(jìn)階之路啦斜做。

暴力求解法的進(jìn)化思路 -- 滑塊法

  • 思路:
    我在網(wǎng)上偶然發(fā)現(xiàn)了一個(gè)跟我的思路非常像苞氮,但是效率高了很多的解法。來自于簡(jiǎn)書冬小羊的這篇博客陨享,可以去讀一下葱淳。
    這個(gè)解法優(yōu)化的點(diǎn)在于:
  1. 不需要維護(hù)一個(gè)子串了,而采用哈希表的方式記錄每一個(gè)字符出現(xiàn)的次數(shù)抛姑,這樣就可以很方便的找到多余的字符。
  2. 同時(shí)也就不需要遍歷子串找到截?cái)帱c(diǎn)艳狐。而是采用雙指針指向子串首尾的方式定硝,一旦子串里有字符重復(fù),那么就移動(dòng)子串頭一格毫目,直到子串里沒有重復(fù)字符為止蔬啡。其實(shí)這一步做的事情就相當(dāng)于截?cái)嘧哟恕?br>

    下面這張圖也來自于冬小羊的博客,大家可以直觀感受一下這個(gè)解法:
    滑動(dòng)法圖解
  • 代碼:
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        start = 0 # 子串起點(diǎn)指針
        end = 0 # 子串終點(diǎn)指針
        char_dict = dict() #統(tǒng)計(jì)子串中每一個(gè)字符出現(xiàn)的個(gè)數(shù)
        lens = 0

        for i in s:
            end += 1
            char_dict[i] = char_dict.get(i,0)+1
            while char_dict[i] > 1:
                char_dict[s[start]] -= 1
                start += 1
            lens = max(lens,end-start)
        return lens
  • 結(jié)果:
    不得不說镀虐,這樣修改之后箱蟆,效果真的是杠杠的

執(zhí)行用時(shí) :80 ms, 在所有 python3 提交中擊敗了78.88%的用戶

因?yàn)檫@樣其實(shí)只有一個(gè)循環(huán),內(nèi)層因?yàn)榍擅钍褂弥羔樅凸1恚ň褪亲值浔恚┧源蟠筇嵘诉\(yùn)行效率刮便,感謝網(wǎng)友朋友們的智慧空猜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恨旱,隨后出現(xiàn)的幾起案子辈毯,更是在濱河造成了極大的恐慌,老刑警劉巖搜贤,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆沃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仪芒,警方通過查閱死者的電腦和手機(jī)唁影,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門耕陷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人据沈,你說我怎么就攤上這事哟沫。” “怎么了卓舵?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵南用,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我掏湾,道長(zhǎng)裹虫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任融击,我火速辦了婚禮筑公,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尊浪。我一直安慰自己匣屡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布拇涤。 她就那樣靜靜地躺著捣作,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹅士。 梳的紋絲不亂的頭發(fā)上券躁,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音掉盅,去河邊找鬼也拜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛趾痘,可吹牛的內(nèi)容都是我干的慢哈。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼永票,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼卵贱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓦侮,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤艰赞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肚吏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體方妖,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年罚攀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了党觅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雌澄。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杯瞻,靈堂內(nèi)的尸體忽然破棺而出镐牺,到底是詐尸還是另有隱情,我是刑警寧澤魁莉,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布睬涧,位于F島的核電站,受9級(jí)特大地震影響旗唁,放射性物質(zhì)發(fā)生泄漏畦浓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一检疫、第九天 我趴在偏房一處隱蔽的房頂上張望讶请。 院中可真熱鬧,春花似錦屎媳、人聲如沸夺溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风响。三九已至,卻和暖如春丹禀,著一層夾襖步出監(jiān)牢的瞬間钞诡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工湃崩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人接箫。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓攒读,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親辛友。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄扁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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